描述
输入:[[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
第一种解法
遍历矩阵,找到起点,然后使用递归分别从上下左右找到剩余节点,得注意一点就是,当前节点遍历以后,应该替换为特殊字符,防止二次遍历。代码如下
public boolean hasPath (char[][] matrix, String word) {
// write code here
if(matrix == null || matrix.length < 1 || word == null){
return false;
}
char[] chars = word.toCharArray();
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if(hasPathResult(matrix,i,j,chars,0)){
return true;
}
}
}
return false;
}
public boolean hasPathResult(char[][] matrix,int i,int j,char[] word,int index){
//边界的判断,如果越界直接返回false。index表示的是查找到字符串word的第几个字符,
//如果这个字符不等于matrix[i][j],说明验证这个坐标路径是走不通的,直接返回false
if(i < 0 || i >= matrix.length || j < 0 || j >= matrix[i].length || matrix[i][j] != word[index]){
return false;
}
if(index == word.length-1){
return true;
}
//为了防止当前节点二次使用
char tmp = matrix[i][j];
matrix[i][j] = '*';
boolean flag = hasPathResult(matrix,i+1,j,word,index+1)||hasPathResult(matrix,i,j+1,word,index+1)||
hasPathResult(matrix,i-1,j,word,index+1) ||hasPathResult(matrix,i,j-1,word,index+1);
matrix[i][j] = tmp;
return flag;
}