java
复制代码
class Solution {
boolean res = false;//结果标志位
int r = 0;//全局 矩阵长宽
int c = 0;
boolean[][] usered = null;
public boolean exist(char[][] board, String word) {
r = board.length;
c = board[0].length;
// 同一个单元格内的字母不允许被重复使用!!!
// 标识字母是否被使用
usered = new boolean[r][c];
char[] chars = word.toCharArray();// 将字符串转换为字符数组
//在矩阵中找到word第一个字符再进行递归
for(int i = 0 ; i < r ; i++)
for(int j = 0 ; j < c ; j++){
if(board[i][j] == chars[0])
backtrack(board,i,j,chars,0,usered); // 0代表word第一个字符 usered 标记已经使用过的表格
}
return res;
}
public void backtrack(char[][] board,int i,int j,char[] chars,int wordIndex,boolean[][] usered){
if(res) return;// 已找到答案直接结束
if(wordIndex == chars.length) {
res = true ;
return;
}
// 越界 或者不相等
// i 和 j 要在矩阵范围内 并且标志位要是fasle 并且当前矩阵格子的字符要是 word当前的字符相等 才会往下递归 否则return
if(i < 0 || j < 0 || i > r-1 || j > c-1 || usered[i][j] || board[i][j] != chars[wordIndex]) return;
// 往下递归 说明符合条件
// 标记已经被使用
usered[i][j] = true;
//四个方向递归
backtrack(board,i-1,j,chars,wordIndex+1,usered);
backtrack(board,i+1,j,chars,wordIndex+1,usered);
backtrack(board,i,j-1,chars,wordIndex+1,usered);
backtrack(board,i,j+1,chars,wordIndex+1,usered);
// 回溯恢复状态
usered[i][j] = false;
}
}