题意
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。
注意:
输入的路径不为空;
所有出现的字符均为大写英文字母;
样例
matrix=
[
[“A”,“B”,“C”,“E”],
[“S”,“F”,“C”,“S”],
[“A”,“D”,“E”,“E”]
]
str=“BCCE” , return “true”
str=“ASAE” , return “false”
遇到的问题
首先题目读错了意思,以为是随便选择,不能连续路径,因此初始化的时候只选择了[0][0]点,后重新审题后修改了多了两层循环;
判断越界的时候将if(i < 0 || j<0 || i>=row || j>=col || visited[i][j] || (matrix[i][j]!=str.charAt(len)))
放到了遍历的外层,导致一直被visited;
第一个点的判断,开始的样例的路径头不在第一个||样例集合只有一个元素,因此默认了满足条件,当样例只有一个元素的时候没法满足,所以把遍历的元素加了一个原点
static int []di = {0,1,0,-1,0}; static int []dj = {0,0,1,0,-1};
class Solution {
static int []di = {0,1,0,-1,0};
static int []dj = {0,0,1,0,-1};
static boolean dfs(char[][] matrix, String str, int i, int j, int row, int col, boolean [][]visited, int len){
if(str.length()==len){
return true;
}
for(int k = 0; k <= 4; k++){
i += di[k];
j += dj[k];
if(i < 0 || j<0 || i>=row || j>=col || visited[i][j] || (matrix[i][j]!=str.charAt(len))){
i -= di[k];
j -= dj[k];
continue;
}
visited[i][j] = true;
if (dfs(matrix, str, i, j, row, col, visited, len+1)){
return true;
}
visited[i][j] = false;
i -= di[k];
j -= dj[k];
}
return false;
}
public boolean hasPath(char[][] matrix, String str) {
if(matrix.length==0 || matrix[0].length==0){
return false;
}
int row = matrix.length;
int col = matrix[0].length;
for (int l = 0; l< row ; l++){
for(int o = 0; o < col; o++){
boolean [][]visited = new boolean[row][col];
if(dfs(matrix, str, l, o, row, col, visited, 0)){
return true;
}
}
}
return false;
}
}