题解 | #矩阵中的路径#
矩阵中的路径
https://www.nowcoder.com/practice/2a49359695a544b8939c77358d29b7e6
解题思路
- 先写一个dfs函数:
- 当索引值超过边界,或当前的矩阵值与字符串相对应的符号不匹配,或者是当前元素已经被遍历过了,则返回False;
- 如果当前已经遍历完目标字符串了,则说明匹配上一条路径了。则直接返回True。
- 否则,给当前值赋值True,代表已经遍历过了。
- 如果这上下左右这四个方向至少有一个方向能找到路径,则返回True。
- 否则将该值的状态改为False,并将函数返回False。
2. 求路径的函数内:遍历矩阵的每一个元素,判断从某个元素开始是否有可行的路径。
代码
Python
class Solution:
def dfs(self, matrix, n, m, i, j, word, k, flag):
if i < 0 or i >= n or j < 0 or j >= m or (matrix[i][j] != word[k]) or flag[i][j]:
return False
if k == len(word) - 1:
return True
flag[i][j] = True
if (self.dfs(matrix, n, m, i-1, j, word, k+1, flag)
or self.dfs(matrix, n, m, i, j-1, word, k+1, flag)
or self.dfs(matrix, n, m, i+1, j, word, k+1, flag)
or self.dfs(matrix, n, m, i, j+1, word, k+1, flag)):
return True
flag[i][j] = False
return False
def hasPath(self , matrix: List[List[str]], word: str) -> bool:
# write code here
if len(matrix) == 0:
return False
n = len(matrix)
m = len(matrix[0])
flag = [[False for i in range(m)] for j in range(n)]
for i in range(n):
for j in range(m):
if self.dfs(matrix, n, m, i, j, word, 0, flag):
return True
return False
C++
#include <vector>
class Solution {
public:
bool dfs(vector<vector<char>> matrix, int n, int m, int i, int j, string word, int k, vector<vector<bool>> flag)
{
if(i <0 || i >= n || j < 0 || j>=m || (matrix[i][j] != word[k]) || flag[i][j])
{
return false;
}
if(k == (word.size() - 1))
{
return true;
}
flag[i][j] = true;
if(dfs(matrix, n, m, i-1, j, word, k+1, flag) ||
dfs(matrix, n, m, i+1, j, word, k+1, flag) ||
dfs(matrix, n, m, i, j-1, word, k+1, flag) ||
dfs(matrix, n, m, i, j+1, word, k+1, flag))
{
return true;
}
flag[i][j] = false;
return false;
}
bool hasPath(vector<vector<char> >& matrix, string word)
{
if(matrix.size() == 0)
{
return false;
}
int n = matrix.size();
int m = matrix[0].size();
vector<vector<bool>> flag(n, vector<bool>(m, false));
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(dfs(matrix, n, m, i, j, word, 0, flag))
{
return true;
}
}
}
return false;
}
};
查看7道真题和解析
