Leedcode 79. 单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中 “相邻” 单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false

提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 仅由大小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/word-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public boolean exist(char[][] board, String word) {
        int m = board.length;
        int n = board[0].length;
        boolean[][] book = new boolean[m][n]; // 默认值为false
//      for (int i = 0; i < m; i++) {
//          Arrays.fill(book[i], false);
//      }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                boolean flag = dfs(board, word, i, j, 0, book);
                if (flag) {
                    return true;
                }
            }
        }
        return false;
    }
    boolean dfs(char[][] board, String word, int i, int j, int cur, boolean[][] book) {
        if (board[i][j] != word.charAt(cur)) { // 不匹配,直接返回
            return false;
        } else if (cur == word.length()-1) {
            return true;
        }
        book[i][j] = true;
        boolean res = false;
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 上 下 左 右
        for (int[] dir : directions) {
            int new_i = i+dir[0];
            int new_j = j+dir[1];
            if (new_i>=0 && new_i<book.length && new_j >=0 && new_j<book[0].length) {
                if (!book[new_i][new_j]) {
                    boolean flag = dfs(board, word, new_i, new_j, cur+1, book);
                    if (flag) {
                        res = true;
                        break;
                    }
                }
            }
        }
        book[i][j] = false;
        return res;
    }
}

总结:

  • book[m][n] 用来记录当前状态已匹配的字符序列,已匹配的字符置为 true,并在回溯时恢复为 false;在匹配下个字符时,不搜索 book[i][j] == true 位置的元素,避免字母的重复使用。
  • 搜索起点在主函数中编写(两层 for 循环;每个结点均可作为起点)。
  • “上下左右” 递归写法:dir = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };(代码 27-31 行)。

一道回溯法的中等题,比较容易超时。

posted @ 2022-07-01 20:35  小小小海怪  阅读(38)  评论(0)    收藏  举报