题目:
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或者垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”, 返回 false
题目思路:
1、单词必须是相邻的字母组成
2、每个单词接下来可上下左右
3、单词一旦被使用之前 要用visited=true
4、使用完之后,要将visited=false;
5、根据示例,可知,开始的board i,j可以不是第一个元素0,0
6、总结上述 使用回溯
6.1 回溯出口 index==word.length() -->flag=true;
6.2 做出选择
6.3 四种走法且判断四种走法获得的board值与word中值是否相等&&索引是否有效&&该值(i,j)是否被访问过。
6.4 撤销选择
代码为:
class Solution {
boolean[][] visited;
int[][] d = {{-1,0},{0,-1},{0,1},{1,0}};
int m=0;
int n=0;
boolean flag;
public boolean exist(char[][] board, String word) {
m=board.length;
n=board[0].length;
//if(m*n<word.length()) return false;
visited=new boolean[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]==word.charAt(0)){
backtrack(board, word, 1, i,j);
if(flag){
return true;
}
}
}
}
return false;
}
public void backtrack(char[][] board, String word, int index, int x, int y){
if(index==word.length()){
flag=true;
return;
}
if(flag==true){
return;
}
visited[x][y]=true;
for(int i=0;i<d.length;i++){
int newX = x+d[i][0];
int newY = y+d[i][1];
if(valid(newX, newY)&&!visited[newX][newY]&&board[newX][newY]==word.charAt(index)){
backtrack(board, word, index+1, newX,newY);
}
}
visited[x][y]=false;
}
public boolean valid(int x, int y){
if(x<0||y<0||x>=m||y>=n){
return false;
}
return true;
}
}