【每日一题】单词搜索

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;
    }
}
posted @ 2020-09-13 23:29  天乔巴夏丶  阅读(141)  评论(0编辑  收藏  举报