题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
例如 a b c e s f c s a d e e
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
题目地址
思路
- 深度优先搜索(DFS)
- 注意边界判断
code
class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str) {
bool *visited = new bool[rows * cols]{false};
for (int i=0; i<rows; i++) {
for (int j=0; j<cols; j++) {
if (dfs(matrix, rows, cols, str, visited, i, j, 0))
return true;
}
}
return false;
}
bool dfs(char* matrix, int rows, int cols, char* str, bool* visited, int i, int j, int step) { // l 为当前已找到的长度
// 结果存在
if(step == strlen(str))
return true;
// 边界条件
if(i<0 || i>=rows || j<0 || j>cols || matrix[i*cols+j]!=str[step] || visited[i*cols+j])
return false;
// 定义 4 个方向;
int next[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
// 最好的做法是作为成员变量,但是 C++ 成员变量的初始化比较麻烦,
// 而且这还是个二维数组,更麻烦,所以每次都重新定义一次,所幸不大
visited[i*cols+j] = true; // 访问标记
for (auto k : next)
if (dfs(matrix, rows, cols, str, visited, i+k[0], j+k[1], step+1))
return true;
visited[i*cols+j] = false; // 清除访问标记
return false;
}
};