思路:这是一个典型的二维迷宫问题,首先应该想到的是使用递归回溯的方法去找到正确的路径。
首先确定测试用例,(空字符串,字符串长度为0,空数组,数组长度为0,矩阵里面包含字符串,不包含字符串)。看到题目要求判断是否包含字符串。首先需要循环遍历找到矩阵中字符与字符串中首位相等的元素下标。进入方法进行递归回溯查找。个人感觉类似于深度遍历的过程。
最需要注意的是需要避免来回判断,比如{a,a} “aaa” 如果没有考虑到的话很容易导致回头判断的情况。因此判断完一个元素满足要求后需要将其做上标记。我的方法是给一个boolean类型二维数组进行记录。后来看到题解中有一个好方法,将元素的值存入一个成员变量中,把矩阵中的这个元素赋值“/0”。如果判断为否再给他赋值回来。 可以节约一个二维数组的空间。最后如果还需要这个数组。可以在return true 的时候赋值回来。
class Solution {
char[][] board;
String word;
public boolean exist(char[][] board, String word) {
//使用递归与回溯的思路
if(board==null||board.length==0||board[0].length==0||word==null||word.length()==0){
return false;
}
this.board=board;
this.word=word;
for(int i=0;i<board.length;i++){
for(int j =0;j<board[i].length;j++){
if(searchWords(i,j,0)){
return true;
}
}
}
return false;
}
public boolean searchWords(int row,int list,int index ){
if(!isNext(row,list,index)){
return false;
}
if(index>=word.length()-1){
return true;
}
//上右下左的顺序去找路
char temp = board[row][list];
board[row][list]='\0';
if((searchWords(row+1,list,index+1))||(searchWords(row,list+1,index+1))
||(searchWords(row,list-1,index+1))||(searchWords(row-1,list,index+1)) ){
return true;
}
board[row][list]=temp;
return false;
}
public boolean isNext(int row,int list,int index){
if(row<0||row>=board.length||list<0||list>=board[row].length){
return false;
}
if(word.charAt(index)==board[row][list]){
return true;
}
return false;
}
}