剑指offer65_矩阵中的路径_题解
矩阵中的路径
题目描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
\[\begin{bmatrix} a & b & c &e \\ s & f & c & s \\ a & d & e& e\\ \end{bmatrix}
\]
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
示例1
输入
"ABCESFCSADEE",3,4,"ABCCED"
返回值
true
示例2
输入
"ABCESFCSADEE",3,4,"ABCB"
返回值
false
分析
方案一:深度优先搜索+剪枝
代码
/*
1.时间复杂度:O(n)
2.空间复杂度:O(k)
k为字符串长度
*/
class Solution
{
public:
bool vis[250][250] = {false};
vector<vector<int>> dir = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
bool dfs(char *matrix, int i, int j, int r, int c, int k, char *str)
{
if (k == strlen(str))
return true;
for (vector<int> d : dir)
{
int newi = i + d[0], newj = j + d[1];
if (newi < 0 || newi >= r || newj < 0 || newj >= c || vis[newi][newj] || matrix[newi * c + newj] != str[k])
continue;
vis[newi][newj] = true;
if (dfs(matrix, newi, newj, r, c, k + 1, str))
return true;
vis[newi][newj] = false;
}
return false;
}
bool hasPath(char *matrix, int r, int c, char *str)
{
for (int i = 0; i < r; ++i)
{
for (int j = 0; j < c; ++j)
{
if (matrix[i * c + j] == str[0])
{
vis[i][j] = true;
if (dfs(matrix, i, j, r, c, 1, str))
return true;
vis[i][j] = false;
}
}
}
return false;
}
};