版权声明:所有的博客都是个人笔记,交流可以留言。未经允许,谢绝转载。。。 https://blog.csdn.net/qq_35976351/article/details/88638586
题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
解题思路
一个经典的DFS解题算法。需要注意的是下标的转换,矩阵是一维的,但是为了方便计算,我们用了3个转换函数进行1-2维的转换计算。注意使用判重即可。需要注意只有一个字母的特殊边界条件。
AC代码
代码是可以通过的。但是还有一个疑问,dfs函数第一个行注释的情况,为什么去掉了就不能完全通过了,希望有dalao可以解释一下。
class Solution {
public:
bool hasPath(const char* matrix, int rows, int cols, const char* str) {
if (rows * cols <= 0 || matrix == nullptr) {
return false;
}
if (str == nullptr || str[0] == '\0') {
return true;
}
// 只有一个字母的特殊情况
if (rows == cols && rows == 1 && str[0] == matrix[0] && str[1] == '\0') {
return true;
}
R = rows;
C = cols;
memset(visited, 0, sizeof(visited));
for (int i = 0; i < R * C; ++i) {
if (dfs(matrix, Row(i), Col(i), str)) {
return true;
}
}
return false;
}
private:
bool dfs(const char* mat, int row, int col, const char* str) {
if (*str == '\0'/* || mat[Pos(row, col)] == *str && *(str + 1) == '\0'*/) {
return true;
}
if (mat[Pos(row, col)] != *str) {
return false;
}
for (int i = 0; i < 4; ++i) {
int r = row + offset[i][0];
int c = col + offset[i][1];
if (r < 0 || c < 0 || r >= R || c >= C || visited[r][c]) {
continue;
}
visited[r][c] = true;
if (dfs(mat, r, c, str + 1)) {
return true;
}
visited[r][c] = false;
}
return false;
}
inline int Pos(int r, int c) { return r * C + c; }
inline int Row(int n) {return n / C;}
inline int Col(int n) { return n % C; }
bool visited[1000][1000];
int offset[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };
int R{ 0 }, C{ 0 };
};