解题思路
深度优先搜索 回溯
class Solution {
//用来标识四个方向
private int[][] d = {{-1,0},{0,1},{1,0},{0,-1}};
private int m,n; //m n 标识平面的尺寸
private boolean[][] visited; //标识每个元素是否被访问过
//判断下标是否越界
private boolean inArea(int x,int y){
return x>=0&&x<m&&y>=0&&y<n;
}
//从board[startx][starty]开始,寻找word[index....word.size()]
private boolean searchWord(char[][] board,String word,int index,int startx,int starty){
//如果找到了最后一个字符 则判断最后一个字符是否匹配
if(index==word.length()-1)
return board[startx][starty] == word.charAt(index);
//首先判断当前元素是否与单词对应的元素匹配
if(board[startx][starty] == word.charAt(index)){
//设定该元素已经访问过
visited[startx][starty]=true;
//向四个方向出发去寻找
for(int i=0;i<4;i++){
//设定新的元素的下标
int newx = startx + d[i][0];
int newy = starty + d[i][1];
//首先判断新的下标是否越界 然后确保之前没有访问过
if(inArea(newx,newy)&&!visited[newx][newy]){
//递归地进行seach 此时单词下标+1 使用的是新的坐标
//如果寻找成功 返回true
if(searchWord(board,word,index+1,newx,newy)){
return true;
}
}
}
//如果四个方向上都没有找到 则回溯 标识该元素没有被访问过
visited[startx][starty]=false;
}
//不匹配直接返回false
return false;
}
public boolean exist(char[][] board, String word) {
//声明平面的大小
m = board.length;
n = board[0].length;
//初始化访问数组
visited = new boolean[m][n];
//遍历数组 尝试从平面的每一个元素来寻找word
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length;j++)
//首先从下标为0的单词元素开始寻找
if(searchWord(board,word,0,i,j))
return true;
}
//如果下面遍历完之后都没有找到 则返回false
return false;
}
}