题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
矩阵中包含一条字符串"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
代码:
import java.util.*;
public class Solution {
int m;
int n;
public boolean hasPath (char[][] matrix, String word) {
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return false;
}
if(word == null || word.length() == 0){
return true;
}
m = matrix.length;
n = matrix[0].length;
boolean[][] mark = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if(matrix[i][j] == word.charAt(0) && search(matrix,i,j,0,mark,word)){
return true;
}
}
}
return false;
}
private boolean search(char[][]matrix,int i,int j,int idx,boolean[][] mark,String word) {
if(idx == word.length()){
return true;
}
if(i < 0 || i >= m || j < 0 || j >= n || mark[i][j]){
return false;
}
if(word.charAt(idx) == matrix[i][j]){
mark[i][j] = true;
if(search(matrix,i+1,j,idx+1,mark,word) ||
search(matrix,i-1,j,idx+1,mark,word)||
search(matrix,i,j+1,idx+1,mark,word)||
search(matrix,i,j-1,idx+1,mark,word)){
return true;
}else {
mark[i][j] = false;
return false;
}
}
return false;
}
}
思路:
遍历数组,找到字符串首字符出现的位置后,进入search()方法,递归的去找其前后左右位置的字符是否和字符串匹配,每匹配到一个,将mark[][]对应的位置设为true,代表已经访问过了。如果后续递归的字符不匹配,在返回false之前。要将mark再改为false,因为这条递归已经不用了。