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

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

 

示例 1:

79. 单词搜索_字符串

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

示例 2:

79. 单词搜索_字符串_02

class Solution {
    boolean ans = false;
    public boolean exist(char[][] board, String word) {
        int m = board.length;
        int n = board[0].length;
        // 同一个单元格内的字母不允许被重复使用!!!
        // 标识字母是否被使用
        boolean[][] used = new boolean[m][n];
        char[] chars = word.toCharArray();
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                // 开头开始匹配
                if(board[i][j] == chars[0]){
                    backtrack(board, i, j, chars, 0, used); 
                }
            }
        }
        return ans;
    }

    public void backtrack(char[][] board, int i, int j, char[] chars, int startIdx, boolean[][] used){
           if(ans){
               // 已找到答案直接结束
               return;
           } 
           int m = board.length;
           int n = board[0].length;
           if(startIdx == chars.length){
               ans = true;
               return;
           }
           // 越界 或者不相等
           if(i < 0 || j < 0 || i >= m || j >= n || board[i][j] != chars[startIdx]){
               return;
           } 

           // 使用过的不能再用了 
           if(used[i][j]){
               return;
           }
           // 没使用过的,置为已使用
           used[i][j] = true;
           // 递归 上下左右四个方向
           backtrack(board, i - 1, j, chars, startIdx + 1, used);
           backtrack(board, i + 1, j, chars, startIdx + 1, used);
           backtrack(board, i, j - 1, chars, startIdx + 1, used);
           backtrack(board, i, j + 1, chars, startIdx + 1, used);
           // 回溯 
           used[i][j] = false; 
    }
}
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true

示例 3:

79. 单词搜索_i++_03

输入: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 仅由大小写英文字母组成