题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。
注意:
输入的路径不为空;
所有出现的字符均为大写英文字母;
样例
样例
matrix=
[
["A","B","C","E"],
["S","F","C","S"],
["A","D","E","E"]
]
str="BCCE" , return "true"
str="ASAE" , return "false"
算法1
按照Y老师视频的说就是 典型的暴搜例子
我们按照搜索的模板来定义
1 寻找起始点 (第一个符合条件的字母) ,添加一个同样大小的多维数组 维护该点是否访问过
2 深度搜索(四个方向扩展)
3 设置正确的退出点 不符合条件 坐标越界 字符串长度越界等
4 继续下一轮搜索 记得将访问数组中对应的点恢复原样
C++ 代码
class Solution {
public:
bool dfs(vector<vector<char>>& matrix, string str,int idx, vector<vector<char>>& vis, int x, int y)
{
//坐标错误则直接返回
if (x < 0 || y < 0 || x >= matrix.size() || y >= matrix[0].size())
return false;
//该点字符与字符串不同 直接返回
if (matrix[x][y] != str[idx])
return false;
//该坐标已经访问 直接返回
if (vis[x ][y] != 0)
return false;
//该点记录置1
vis[x][y] = 1;
//检测是否完全符合str字符串
if (idx == str.length() - 1)
return true;
//四个方向的遍历 任意一个符合条件则返回成功
if ( dfs(matrix, str, idx + 1, vis, x + 1, y))
return true;
if ( dfs(matrix, str, idx + 1, vis, x - 1, y))
return true;
if ( dfs(matrix, str, idx + 1, vis, x, y + 1))
return true;
if (dfs(matrix, str, idx + 1, vis, x, y - 1))
return true;
//函数退出的时候记得回复访问数据
vis[x][y] = 0;
return false;
}
bool hasPath(vector<vector<char>>& matrix, string str) {
vector<vector<char>> vis = matrix;
for (int i = 0; i < vis.size(); i++) {
for (int j = 0; j < vis[0].size(); j++) {
vis[i][j] = 0;
}
}
for(int i = 0; i < matrix.size(); i++) {
for (int j = 0; j < matrix[0].size(); j++) {
if (matrix[i][j] == str[0]) {
if (true == dfs(matrix,str,0, vis,i,j))
{
return true;
}
}
}
}
return false;
}
};
优秀
niubi
终于明白了