给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

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

 

例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。

示例 1:

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

示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

 

提示:

  • 1 <= board.length <= 200
  • 1 <= board[i].length <= 200
  • boardword 仅由大小写英文字母组成

 

注意:本题与主站 79 题相同:https://leetcode-cn.com/problems/word-search/

Related Topics
  • 数组
  • 回溯
  • 矩阵

  • 👍 577
  • 👎 0
  • 回溯模板题了已经相当

    回溯模板题了已经相当于。

    1. 找一个开头匹配的
    2. 往四个方向开始匹配下一个字符
    3. 中途标记已经访问过的节点
    4. 退出递归的时候记得要把访问过的节点标记为未访问过
    class Solution {
        boolean[][] visited;
    
        char[][] board;
    
        int[][] dist = {{1,0},{-1,0},{0,1},{0,-1}};
    
        public boolean exist(char[][] board, String word) {
            visited = new boolean[board.length][board[0].length];
            this.board = board;
    
            for (int row = 0; row < board.length; row++) {
                for (int col = 0; col < board[row].length; col++) {
                    if (board[row][col] == word.charAt(0) && searchWord(word,0, row, col)){
                        return true;
                    }
                }
            }
            return false;
        }
    
        boolean searchWord(String word, int idx, int row,int col){
            if (idx == word.length()-1 && word.charAt(idx) == board[row][col]){
                return true;
            }
            if (word.charAt(idx) != board[row][col]){
                return false;
            }
            visited[row][col] = true;
    
            for (int[] ints : dist) {
    
                int x = row + ints[0];
                int y = col + ints[1];
                if ( x<0 || y<0 || x >= board.length || y >= board[0].length || visited[x][y] ){
                    continue;
                }
    
                if (searchWord(word,idx+1,x,y)){
                    return true;
                }
            }
            visited[row][col] = false;
            return false;
        }
    }