题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。
注意:
输入的路径不为空;
所有出现的字符均为大写英文字母;
样例
matrix=
[
["A","B","C","E"],
["S","F","C","S"],
["A","D","E","E"]
]
str="BCCE" , return "true"
str="ASAE" , return "false"
时间复杂度 O(n^2 * 3^k)
照抄y总代码
C++ 代码
class Solution {
public:
bool hasPath(vector<vector<char>>& matrix, string &str) {
// 以字符串str中的每一个字符作为起始字符在矩阵matrix数组中深度搜索
for(int i = 0; i < matrix.size(); i++)
for(int j = 0; j < matrix[i].size(); j++)
if(dfs(matrix, str, 0, i, j)) return true;
return false;
}
// u是字符串的下标,(r, c)是字符串中的一个字符对应于矩阵中的字符的行号和列号
bool dfs(vector<vector<char>>& matrix, string& str, int u, int r, int c) {
if(matrix[r][c] != str[u]) return false; // 搜索到某个字符和矩阵的字符不相同
if(u == str.size() - 1) return true; // 字符串的下标走到结尾,在矩阵中成功找到结果
char t = matrix[r][c]; // 保存矩阵中(r,c)处的字符
matrix[r][c] = '*'; // 在(r, c)处做标记,此处已经访问过
int dr[] = {-1, 0 , 1, 0}, dc[] = {0, 1, 0, -1};
for(int i = 0; i < 4; i++) {
int x = r + dr[i], y = c + dc[i];
// 不合法,探索下一步
if(x < 0 || x > matrix.size() - 1) continue;
if(y < 0 || y > matrix[i].size() - 1) continue;
// 找到字符str[u + 1]在矩阵中与之相同的字符
if(dfs(matrix, str, u + 1, x, y)) return true;
}
matrix[r][c] = t; // 恢复(r, c)处的字符,回溯
return false;
}
};