题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
例如
矩阵中包含一条字符串"bcced
“的路径,但是矩阵中不包含”abcb
"路径,因为字符串的第一个字符b
占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
求解思路
试探法 — 回溯法:
在矩阵中进行逐个试探,从给定字符串中的字符挨个匹配,若匹配不到则退回去重新匹配
PS: 关于回溯法,有不懂的童鞋推荐一看一个小故事读懂N皇后问题,相信你读完后你会完全了解回溯法
C++实现
class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
bool visted[rows*cols];
int i,j;
for (i=0;i<rows*cols;i++)visted[i]=0;
int vis=0;
for(i=0;i<rows;i++){
for(j=0;j<cols;j++){
if(yes(matrix,rows,cols,str,i,j,vis,visted))//逐个匹配
return true;
}
}
return false;
}
bool yes(char* matrix, int rows, int cols, char* str,
int row,int col,int &vis,bool *visted){
//该函数用于匹配字符串
if(str[vis]=='\0')return true;
bool can=false;
if(row>=0&&row<rows&&col>=0&&col<cols
&&matrix[row*cols+col]==str[vis]
&&!visted[row*cols+col]){
++vis;
visted[row*cols+col]=true;
//试探各种路径,只要有1条走得通即可
can=(yes(matrix,rows,cols,str,row+1,col,vis,visted)
||yes(matrix,rows,cols,str,row-1,col,vis,visted)
||yes(matrix,rows,cols,str,row,col+1,vis,visted)
||yes(matrix,rows,cols,str,row,col-1,vis,visted)
);
if(!can){
--vis;
visted[row*cols+col]=false;
}
}
return can;
}
};
运行时间:3ms
占用内存:604k