【题目描述】
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
例如:
示例:
输入 | 输出 |
---|---|
“ABCESFCSADEE”,3,4,“ABCCED” | true |
【解法】-DFS
class Solution {
public:
char *mat = 0;
int h = 0, w = 0;
int str_len = 0;
int dir[5] = {-1, 0, 1, 0, -1};//参考JZ19-B站解法,矩阵算法中,此方法尤为重要
bool dfs(int i, int j, int pos, char *str) {
// 因为dfs调用前,没有进行边界检查,
// 所以需要第一步进行边界检查,
// 因为后面需要访问mat中元素,不能越界访问
if (i < 0 || i >= h || j < 0 || j >= w) {
return false;
}
char ch = mat[i * w + j];
// 判断是否访问过
// 如果没有访问过,判断是否和字符串str[pos]匹配
//*******这一步是为了寻找str开头在矩阵中的位置************//
if (ch == '#' || ch != str[pos]) {
return false;
}
// 如果匹配,判断是否匹配到最后一个字符
if (pos + 1 == str_len) {
return true;
}
// 说明当前字符成功匹配,标记一下,下次不能再次进入
mat[i * w + j] = '#';
//**********上下左右再次判断**************//
for (int k = 0; k < 4; ++k) {
if (dfs(i + dir[k], j + dir[k + 1], pos + 1, str)) {
return true;
}
}
// 如果4个方向都无法匹配 str[pos + 1]
// 则回溯, 将'#' 还原成 ch
mat[i * w + j] = ch;
// 说明此次匹配是不成功的
return false;
}
bool hasPath(char* matrix, int rows, int cols, char* str)
{
mat = matrix;
h = rows, w = cols;
str_len = strlen(str);
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
if (dfs(i, j, 0, str)) {
return true;
}
}
}
return false;
}
};