描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
示例1
输入: [[a,b,c,e],[s,f,c,s],[a,d,e,e]],“abcced”
返回值: true
示例2
输入: [[a,b,c,e],[s,f,c,s],[a,d,e,e]],“abcb”
返回值: false
备注:
0 <= matrix.length <= 200
0 <= matrix[i].length <= 200
思路:
看到矩形路径,直接就想到了dfs解决问题
时间复杂度:O(mn*k^3),m和n是矩阵的宽和高,最坏的情况下遍历矩阵的所有位置,k是字符串的长度,下面的dfs我们可以把它看做是一棵4叉树,除了第一次的时候可以往4个方向走,其他情况下只能往3个方向走(进来的那个方向回不去)
空间复杂度:O(K),k是字符串的长度
代码
import java.util.*;
public class Solution {
public boolean hasPath (char[][] matrix, String word) {
if (matrix == null || word == null || word.length() == 0) {
return false;
}
char[] words = word.toCharArray();
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (dfs(matrix, words, i, j, 0)) {
return true;
}
}
}
return false;
}
//index表示的是查找到字符串word的第几个字符 i,j表示当前判断矩阵中的位置
private boolean dfs(char[][] matrix, char[] words, int i, int j, int index) {
//如果越界或者当前位置与对应字符数组中的不匹配 返回falsze
if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length
|| matrix[i][j] != words[index]) {
return false;
}
//最后一个字符判断符合要求 返回true
if (index == words.length-1) {
return true;
}
char temp = matrix[i][j];
//临时把对应矩形位置的字符替换为! 代表已经访问过
matrix[i][j] = '!';
//递归判断上下左右4个方向的结果
boolean res = dfs(matrix, words, i-1, j, index+1)
|| dfs(matrix, words, i+1, j, index+1)
|| dfs(matrix, words, i, j-1, index+1)
|| dfs(matrix, words, i, j+1, index+1);
//递归后字符还原
matrix[i][j] = temp;
return res;
}
}