题目
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。
注意
:
- 输入的路径不为空;
- 所有出现的字符均为大写英文字母;
- 数据范围
- 矩阵中元素的总个数 [0,900]。
- 路径字符串的总长度 [0,900]。
示例
matrix=
[
["A","B","C","E"],
["S","F","C","S"],
["A","D","E","E"]
]
- str="BCCE" , return "true"
- str="ASAE" , return "false"
代码
解法:from y总
: DFS
class Solution {
public:
// 暴力枚举
bool hasPath(vector<vector<char>>& matrix, string str) {
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;
}
bool dfs(vector<vector<char>> &matrix, string &str, int u, int x, int y) {
if (matrix[x][y] != str[u]) return false; // matrix[x][y] 不能作为路径起点
if (u == str.size() - 1) return true;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; // 方向数组 [上右下左]
char t = matrix[x][y]; // 保存
matrix[x][y] = '*'; // 标记已访问
for (int i = 0; i < 4; i ++ ) { // 上右下左
int a = x + dx[i], b = y + dy[i];
if (a >= 0 && a < matrix.size() && b >= 0 && b < matrix[a].size()) {
if (dfs(matrix, str, u + 1, a, b)) return true;
}
}
matrix[x][y] = t; // 恢复
return false;
}
};
代码分析
:1、路径搜索很常见,这题也是很经典。
2、hasPath(vector<vector<char>>& matrix, string str)
枚举矩阵中每一个坐标。主要实现还是在dfs
中。
if (matrix[x][y] != str[u]) return false;
说明 matrix[x][y]
不能作为路径起点,直接返回 false。
if (u == str.size() - 1) return true;
截止条件,从 0 开始计数,所以 u == str.size() - 1
时,就是找到了一条有效的路径
for (int i = 0; i < 4; i ++ ) { // 上右下左
int a = x + dx[i], b = y + dy[i];
if (a >= 0 && a < matrix.size() && b >= 0 && b < matrix[a].size()) {
if (dfs(matrix, str, u + 1, a, b)) return true;
}
}
接着 for 循环向 上右下左
四个方向依次遍历(跟随方向数组)
if (dfs(matrix, str, u + 1, a, b)) return true;
如果找得到,会依次返回 true
matrix[x][y] = t; // 恢复
对于矩阵中每一个坐标的搜索,如果找到了就返回true了,如果没找到,需要恢复
该坐标的原值。
题目
:矩阵中的路径