暴力回溯:
class Solution {
public boolean exist(char[][] board, String word) {
int row = board[0].length;
int col = board.length;
int[][] visited = new int[col][row];
char[] words = word.toCharArray();
for(int x = 0; x < row ; x++){
for(int y = 0; y < col; y++){
if(isContains(board,x,y,words,0,visited)){
return true;
}
}
}
return false;
}
public boolean isContains(char[][] board,int x,int y,char[] words,int k,int[][] visited){
if(k==words.length){
return true;
}
if( x<0 || y < 0||x >= board[0].length || y >= board.length || visited[y][x] == 1){
return false;
}
//如果当前值不是等于,就返回false;
if(board[y][x] != words[k]){
return false;
}
//如果当前值是word[k],那么就找当前xy的四周,也就是上左下右,并且把当前位置标志位1表示走过。
visited[y][x] = 1;
if(isContains(board,x,y-1,words,k+1,visited)) return true;
if(isContains(board,x+1,y,words,k+1,visited)) return true;
if(isContains(board,x,y+1,words,k+1,visited)) return true;
if(isContains(board,x-1,y,words,k+1,visited)) return true;
//如果上面遍历完了还没有返回true,说明当前节点的周围节点都不是下一个要找寻的节点,就需要回溯到当前节点的上一个节点。把标志位恢复为0;
visited[y][x] = 0;
return false;
}
}