今天刷一道深搜的题,对递归的一点感想,特此记录
[79. 单词搜索 - 力扣(LeetCode)](https://leetcode.cn/problems/word-search/description/)
思路分析
这道题很明显是一个dfs问题,我们只需要从将每一个起点开始搜索直到单词结尾即可
- 参数: (x,y) 指向矩阵的位置,u:指向当前应该匹配的单词位置
- 我们只需要有一条路符合要求即可
- 所以返回值为 boolean
class Solution {
char[][] boa;
char[] ch;
int n,m;
int[] dx={0,1,0,-1};
int[] dy={1,0,-1,0};
public boolean exist(char[][] board, String word) {
boa=board;
ch=word.toCharArray();
n=board.length;
m=board[0].length;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
//问题一:为什么不是 return dfs(i,j,0)
//语句5
if(dfs(i,j,0))return true;
}
}
// dfs(0,0,0);
return false;
}
boolean dfs(int x,int y,int u){
if(ch[u]!=boa[x][y])return false;
//语句4
if(u==ch.length-1){
return true;
}
char t=boa[x][y];
boa[x][y]='*';
for(int i=0;i<4;i++){
int a=x+dx[i];
int b=y+dy[i];
if(a<0 || a>=n || b<0 ||b>=m || boa[a][b]=='*')continue;
//2.为什么不是 dfs(i,j,u+1);
if(dfs(a,b,u+1))return true;
//dfs(a,u+1)为何出错???
}
//为什么要在这里恢复答案
//当在当前位置(x,y)时,我们有可以向四个方向扩展,每个方向可以作为下一层的选择
//所以,应该在四个方向遍历完之后恢复现场
boa[x][y]=t;
//3.
return false;
}
}
问题一
假设dfs算法是正确的
return dfs(i,j,0)
如果这样写,只会返回以(0,0)为起点的搜索
if(dsf(i,j,0)) return true
这样写,就只有当从 该点搜索到正确路径,返回true时才会结束遍历
如果(0,0)开始搜索不符合条件就会开始下一个点搜索
直至从(x,y)可以搜索到对应的路径,返回true结束该搜索
如果所有点都作为起点不符合要求,就会执行最后的 return false;
问题二
dfs(i,j,u+1)
- 这样的返回值与下一层搜索的返回值无关,最后只会返回 3. 处的
return false
我们以图中示例举例,
- 假设我们搜索到 u=5,字母D,本层递归 返回 false
- 我们结束这层,返回倒数第二层,但是没有语句接受返回值,依旧会执行 3处的return false 而不会返回true
- 倒数第三层,。。。。同理,最后的结果就是 第一层的 3 处的 return false
if(dfs(i,j,u+1)) return ture;
这样就是接受下一层的参数,只有当下一层返回false时就会结束该方法,
我们同样以示例举例(假设n层)
- n: 执行语句4 返回true
- n-1 在没有执行到 3. 处语句时就会 执行
if(dfs(i,j,u+1)) return ture;
返回true 并结束本层,向上返回,直到第一层- 1:依然执行 if语句,返回true
- 主方法中 执行 语句5 返回true
思考总结