题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
解题思路
1、首先遍历第一个字母,比如对于bcced来说,先找到第一个b,然后接下来再递归找c
2、若bcced中的字母全部可以找到,则成功
3、若某个字母不匹配,则返回false即可
4、注意在遍历的时候需要将已经遍历过的位置做标记,我是直接将遍历过的字符置为1
通过代码
public class Solution {
public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
{
char [][] matrix1= new char[rows][cols];
int k=0;
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++) {
matrix1[i][j]=matrix[k];
k++;
}
boolean res=false;
for(int i=0;i<rows;i++) {
for(int j=0;j<cols;j++) {
if (matrix1[i][j]==str[0]) {
char[][] matrixFlag=new char[rows][cols];
for(int p=0;p<rows;p++)
for(int q=0;q<cols;q++) {
matrixFlag[p][q]=matrix1[p][q];
}
char[] strFlag=new char[str.length];
for(int p=0;p<str.length;p++)
strFlag[p]=str[p];
if (isNot(matrixFlag,rows,cols,strFlag,i,j)) return true;
else continue;
}
}
}
return res;
}
public boolean isNot(char[][] matrix, int rows, int cols, char[] str,int x,int y) {
if (x<0||x>rows-1||y<0||y>cols-1||matrix[x][y]!=str[0]) return false;
else if((matrix[x][y]==str[0])&&(str.length==1)) return true;
else {
char [] str1=new char[str.length-1];
for(int i=1,j=0;i<str.length;i++,j++) {
str1[j]=str[i];
}
matrix[x][y]='1';
return isNot(matrix, rows, cols, str1, x+1, y)||
isNot(matrix, rows, cols, str1, x-1, y)||
isNot(matrix, rows, cols, str1, x, y+1)||
isNot(matrix, rows, cols, str1, x, y-1);
}
}
}