题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
a b c e
s f c s
a d e e
解题思路
这是一个可以用回朔法解决的典型题。所谓回溯法就是按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。具体到这道题目,首先遍历矩阵,字符串首字母所在的位置,然后对于每个字符,如果在矩阵中找到了其在矩阵中的位置,进行下一次寻找的时候,可以从上、下、左、右四个方向(注意对边界的判断)进行递归寻找,如果找到了则继续寻找下一个字符;如果没有找到的话,则回到上一个字符重新寻找。直到找到全部字符在矩阵中对应的位置。
代码
/*
* matrix 输入矩阵
* rows 矩阵行数
* cols 矩阵列数
* str 要搜索的字符串
*/
class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if( strlen(matrix) == 0 || strlen(matrix) != rows * cols || str == NULL )
return false;
used = vector<bool> (strlen(matrix), false);
for( int i=0;i<rows;i++ )
for( int j=0;j<cols;j++ )
if( help(matrix, rows, cols, i, j, str, 0 ) )
return true;
return false;
}
vector<vector<int>> way = {{0,-1},{0,1},{-1,0},{1,0}};
vector<bool> used;
bool help(char* matrix, int rows, int cols, int rth, int cth, char* str, int num )
{
if( str[num] == '\0' )
return true;
if( rth*cols+cth >= strlen(matrix) )
return false;
if( used[rth*cols+cth] )
return false;
if( matrix[rth*cols+cth] != str[num] )
return false;
used[rth*cols+cth] = true;
for( int i=0;i<4;i++ )
if( help(matrix, rows, cols, rth+way[i][0], cth+way[i][1], str, num+1 ) )
return true;
used[rth*cols+cth] = false;
return false;
}
};