题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
例如
a b t g
c f c s
j d e h
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
解题思路:
使用深度优先搜索遍历来实现
class Solution {
public:
//************************************
// Method: dfs 矩阵中的路径
// FullName: dfs
// Access: public
// Returns: bool
// Qualifier:
// Parameter: char * matrix 给定矩阵
// Parameter: int rows 矩阵的行
// Parameter: int cols 矩阵的列
// Parameter: char * str 给定匹配字符串
// Parameter: int i 当前字符的行
// Parameter: int j 当前字符的列
// Parameter: int k 当前字符在 str 中的位置
// Parameter: bool * dp 访问数组
//************************************
bool dfs(char* matrix, int rows, int cols, char* str, int i, int j, int k, bool* dp) {
//因为是一维数组存放的矩阵
int index = cols * i + j;//相当于二维矩阵的 matrix(i,j)
if (i < 0 || i >= rows || j < 0 || j >= cols || matrix[index] != str[k] || dp[index] == true)
{
//dp[index] = true 表示该字符已经被访问过了
return false;
}
if (str[k+1] == '\0')//字符串查找结束
{
return true;
}
dp[index] = true;
if (dfs(matrix,rows,cols,str,i - 1,j,k + 1,dp) ||
dfs(matrix,rows,cols,str,i,j - 1,k + 1,dp) ||
dfs(matrix,rows,cols,str,i + 1,j,k + 1,dp) ||
dfs(matrix,rows,cols,str,i,j + 1,k + 1,dp)
)
{
return true;
}
dp[index] = false;//恢复到原来的状态
return false;
}
bool hasPath(char* matrix, int rows, int cols, char* str) {
if (matrix == NULL || str == NULL || rows <= 0 || cols <= 0)
{
return false;
}
bool* dp = new bool[rows * cols];
/*
memset 是按照字节对待初始化空间进行初始化的,
也就是说,函数里面的第二个参数的那个初值(一般为0)是按照一个一个字节往第一个参数所指区域赋值的,
所以,在memset使用时要千万小心,在给char以外的数组赋值时,只能初始化为0或者-1。
而如果初始化为其他的值,就会一个字节一个字节的进行赋值,从而出现奇怪的结果。
*/
memset(dp, false, rows * cols);
for (int i = 0;i < rows;i++)
{
for (int j = 0; j < cols; j++)
{
if ( dfs(matrix, rows, cols, str, i, j, 0, dp) )
{
return true;
}
}
}
delete[] dp;
return false;
}
}