class Solution {
public boolean hasPath(char[][] matrix, String str) {
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
if(dfs(matrix,str,0,i,j)){
return true;
}
}
}
return false;
}
public boolean dfs(char[][]matrix,String str,int u,int x,int y){
if(str.charAt(u)!=matrix[x][y])return false;
if(u==str.length()-1)return true;
int dx[]=new int[]{0,-1,0,1};
int dy[]=new int[]{1,0,-1,0};
char t=matrix[x][y];
matrix[x][y]='*';//因为不可以重复利用,所以需要将相应的字符改变成未出现过的字符,之后再重新赋值。
for(int i=0;i<4;i++){
int a=x+dx[i];
int b=y+dy[i];
if(a>=0&&a<matrix.length&&b>=0&&b<matrix[a].length){
if(dfs(matrix,str,u+1,a,b)) return true;
}
}
matrix[x][y]=t;
return false;
}
}
mmp系列,这道题应该是剑指offer上的原题,因为自己用的是Java所以,需要去理解好他的逻辑之后,再写出Java版本。
好吧,这道题目卡了我很久。在具体的矩阵中找出对应字符串的路径。

首先,以矩阵中任意字符开始都有可能,所以我们需要两层for循环来逐个实验。
具体的以b开始,则需要向四周遍历以判断周边的字符是否在对应的字符串中,代码中dfs的递归方法就是逐个的去遍历周围的字符。卡住我很长时间的点就在于dfs时应当先判断下一个字符是否在对应的str中,之后再判断符合条件的长度u是否等于对应的str的长度。dfs可以说是解决这一类问题的模板,作为回溯法的模板还是很好的。同时需要注意的是,因为对于任意一个字符,可能向其四周扩展,且每个字符只能遍历一次,所以这里需要我们将遍历过的字符用一个从未出现过的字符代替,防止字符的重复使用。当然这里也可以用一个visited数组来实现。

3967

被折叠的 条评论
为什么被折叠?



