描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 \begin{bmatrix} a & b & c &e \\ s & f & c & s \\ a & d & e& e\\ \end{bmatrix}\quad⎣⎡asabfdcceese⎦⎤ 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
示例1
输入:
"ABCESFCSADEE",3,4,"ABCCED"
复制返回值:
true
复制
示例2
输入:
"ABCESFCSADEE",3,4,"ABCB"
复制返回值:
false
思路:
深度优先遍历
class Solution {
public:
int col,row;//定义全局变量
//定义上下左右的操作
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
bool hasPath(char* matrix, int rows, int cols, char* str)
{
col=cols,row=rows;
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
if(dfs(matrix,str,0,i,j)) return true;
return false;
}
bool dfs(char* matrix,char* str,int u,int x,int y){
//检查坐标是否越界
if(u==strlen(str)) return true; //如果字符串的长度等于搜索长度u则表示找到,返回true
if(x<0 || x>=row || y<0 || y>=col) return false;
char t = matrix[x*col+y]; //搜索的当前元素
if(t!=str[u])return false; //如果有元素不等则返回false
matrix[x*col+y] = '*'; //将访问过的位置屏蔽掉
for(int i=0;i<4;i++){
int a = x+dx[i],b=y+dy[i]; //进行上下左右变换
if(dfs(matrix,str,u+1,a,b)) return true;
}
matrix[x*col+y] = t; //将访问过值放回原矩阵
return false;
}
};