代码:
class Solution {
public boolean exist(char[][] board, String word) {
char[] ch = word.toCharArray();
//从每个点出发,找了一遍
for(int i = 0;i < board.length;i++){
for(int j = 0;j < board[0].length;j++){
if(dfs(board,ch,i,j,0)) return true;
}
}
return false;
}
//深度优先+回溯
//board是进行寻找的数组,work是对比的字符串的字节数组,i、j是位置,k是对比过的位数
boolean dfs(char[][] board, char[] word,int i,int j,int k){
//包含了角标越界、不相等的情况
//if(i < 0 || i >= board.length || j < 0 || j > board[0].length || board[i][j] != word[k]) return false;
if(i >= board.length || i < 0 || j > board[0].length || j < 0 || board[i][j] != word[k]) return false;
if(k == word.length - 1) return true;//说明对比完了
//上面终止条件都通过,进入了当前的点
//先将该点标记为不可访问的点
board[i][j] = '\0';//可以有其他标记方式;
//如果没有错误,开始进行下一步四个方向的对比
boolean res = dfs(board, word,i - 1,j, k + 1) ||
dfs(board, word,i,j + 1, k + 1) ||
dfs(board, word,i + 1,j, k + 1) ||
dfs(board, word,i,j - 1, k + 1);
//回溯
board[i][j] = word[k];
return res;
}
}