• 【每日一题】单词搜索


    79. 单词搜索

    给定一个二维网格和一个单词,找出该单词是否存在于网格中。

    单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    示例:

    board =
    [
      ['A','B','C','E'],
      ['S','F','C','S'],
      ['A','D','E','E']
    ]
    
    给定 word = "ABCCED", 返回 true
    给定 word = "SEE", 返回 true
    给定 word = "ABCB", 返回 false
    

    提示:

    • boardword 中只包含大写和小写英文字母。
    • 1 <= board.length <= 200
    • 1 <= board[i].length <= 200
    • 1 <= word.length <= 10^3

    思考:

    深度优先搜索

    class Solution {
        //定义全局变量,省去递归传入每个方法参数的操作
        int m, n;
        char[][] board;
        boolean[][] st;
        String word;
    
        public boolean exist(char[][] board, String word) {
            this.board = board;
            this.word = word;
    
            m = board.length;
            n = board[0].length;
            st = new boolean[m][n];
    
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (board[i][j] == word.charAt(0)) { //一旦第一个字符匹配
                        if (dfs(i, j, 1)) { //看看下一个字符
                            return true;
                        }
    
                    }
                }
            }
            return false;
        }
    
        boolean dfs(int x, int y, int u) {
            
            if (u == word.length()) return true;
            st[x][y] = true; //标记该点走过,防止在重复走,导致死循环
            int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1}; //定义四个方向的常规做法
    
            for (int i = 0; i < 4; i++) {
                int a = x + dx[i], b = y + dy[i];
                //满足三个条件: 1、当前的点首先满足条件 要和对应位置上的字符相等。
                //2 下个点在边界内 3、下个点是没有走过的
                if (a >= 0 && a < m && b >= 0 && b < n && board[a][b] == word.charAt(u)&&!st[a][b]) { 
                    if (dfs(a, b, u + 1)) return true;
                }
            }
            st[x][y] = false;//状态重置
            return false;
        }
    }
    
  • 相关阅读:
    微信小程序页面标签中无法使用的js语法
    React-Native真机调试
    微信小程序button设置宽度无效
    CSS禁止选中文本
    vue之 ref 和$refs的使用
    scrapy之 Spider Middleware(爬虫中间件)
    kafka
    Linux select、poll和epoll
    C/C++ 在一个一维数组中查找两个数,使得它们之和等于给定的某个值
    C/C++ 求浮点数平方根
  • 原文地址:https://www.cnblogs.com/summerday152/p/13664119.html
Copyright © 2020-2023  润新知