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