题目
思路
- 回溯直接解,因为之前用回溯解的都超时了,我竟然没想起这个我最熟悉的解法…
代码
boolean ans=false;
public boolean exist(char[][] board, String word) {
for(int i=0;i<board.length;i++){
for(int j=0;j<board[0].length;j++){
if(board[i][j]==word.charAt(0)){
boolean[][] flag = new boolean[board.length][board[0].length];
flag[i][j]=true;
Back(board,word,i,j,1,flag);
}
}
}
return ans;
}
public void Back(char[][] board,String word,int i,int j,int index,boolean[][] flag){
if(index==word.length()){
ans=true;
return;
}
if(i+1<board.length && flag[i+1][j]==false && board[i+1][j]==word.charAt(index)){
flag[i+1][j]=true;
Back(board,word,i+1,j,index+1,flag);
flag[i+1][j]=false;
}
if(j+1<board[0].length && flag[i][j+1]==false &&board[i][j+1]==word.charAt(index)){
flag[i][j+1]=true;
Back(board,word,i,j+1,index+1,flag);
flag[i][j+1]=false;
}
if(j-1>=0 && flag[i][j-1]==false && board[i][j-1]==word.charAt(index)){
flag[i][j-1]=true;
Back(board,word,i,j-1,index+1,flag);
flag[i][j-1]=false;
}
if(i-1>=0 && flag[i-1][j]==false && board[i-1][j]==word.charAt(index)){
flag[i-1][j]=true;
Back(board,word,i-1,j,index+1,flag);
flag[i-1][j]=false;
}
}