Practice54:
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如

矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
S1
牛客解题法
class Solution {
public:
char *mat = 0;
int h = 0, w = 0;
int str_len = 0;
int dir[5] = {-1, 0, 1, 0, -1};
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]匹配
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;
}
};

博客围绕Practice54展开,要求设计一个函数判断矩阵中是否存在包含某字符串所有字符的路径,路径可从任意格子开始,每步可向上下左右移动一格,且不能重复进入已走过的格子,还提及牛客解题法。
105

被折叠的 条评论
为什么被折叠?



