思路:
这道题用回溯法解决,主要难点在于,每次遍历不能重复遍历已走过路径中的元素,要建立一个map或者和word同等大小的二维数组来记录已经遍历过的元素。而且每次当遍历到的字符和word对应位置的字符不一致时就要及时退出遍历,否则回超时。
每次遍历到一个元素之后,继续前进时有四个方向可以选择,上,下,左,右,然后我们还需要判断往上/下/左/右走之后有没有和已走过的路径上的元素重复了,如果重复了就不能走。
class Solution {
StringBuffer route = new StringBuffer();
int count=0;
public void findall(char[][] board, String word, int[][] visited, int i, int j)
{
// System.out.println(i+" "+j);
// System.out.println(route);
if(word.charAt(route.length()-1)!=route.charAt(route.length()-1))
{
return;
}
if(route.length() == word.length())
{
String r = route.toString();
if(r.equals(word))
count++;
else
return;
}
if(count>0)
return;
if(i>0&&visited[i-1][j]==0)//说明可以往上走
{
route.append(board[i-1][j]);
visited[i-1][j]=1;
findall(board, word,visited,i-1, j);
route.deleteCharAt(route.length()-1);
visited[i-1][j]=0;
}
if(i+1<board.length&&visited[i+1][j]==0)//说明可以往下走
{
route.append(board[i+1][j]);
visited[i+1][j] = 1;
findall(board, word,visited,i+1, j);
route.deleteCharAt(route.length()-1);
visited[i+1][j] = 0;
}
if(j-1>=0&&visited[i][j-1]==0)//说明可以往左走
{
route.append(board[i][j-1]);
visited[i][j-1]=1;
findall( board, word,visited,i,j-1);
route.deleteCharAt(route.length()-1);
visited[i][j-1]=0;
}
if(j+1<board[0].length&&visited[i][j+1]==0)//说明可以往右走
{
route.append(board[i][j+1]);
visited[i][j+1]=1;
findall( board, word,visited, i, j+1);
route.deleteCharAt(route.length()-1);
visited[i][j+1]=0;
}
}
public boolean exist(char[][] board, String word) {
int[][] visited = new int[board.length][board[0].length];
for(int i=0;i<board.length;i++)
{
for(int j = 0;j<board[0].length;j++)
{
route.append(board[i][j]);
visited[i][j] = 1;
findall(board,word,visited,i,j);
if(count>0)
return true;
route.deleteCharAt(route.length()-1);
visited[i][j] = 0;
}
}
return false;
}
}