题解 | #矩阵中的路径#
矩阵中的路径
https://www.nowcoder.com/practice/2a49359695a544b8939c77358d29b7e6
深度优先搜索 + 回溯, 见注释。
回溯一般可以设置一个栈,入栈出栈。
本题还可以将访问过的元素,设置为不可能匹配到的字符,这样的话再次访问就必然失败。最后再恢复即可。
如matrix[i][j] = '',设置成空,则再次访问一定失败。递归完后,恢复成word[k]。
可以节省一点空间。
# class Solution: def hasPath(self , matrix: List[List[str]], word: str) -> bool: a = [] col = len(matrix) row = len(matrix[0]) # 深度优先搜索 + 回溯。i,j描述矩阵的位置,k描述要匹配的字符的位置 # 设置一个列表记录已访问位置(i, j),如False就回溯,即出栈 def dfs(i,j,k): # 出界,已访问,不等。都返回False if i not in range(col) or j not in range(row) or (i, j) in a or matrix[i][j] != word[k]: return False # 如果匹配成功并到了最后,返回True if k == len(word) - 1: return True # 未到最后,当前匹配成功,先将位置入栈 a.append((i, j)) # 递归搜索后续的,返回False之前要先出栈 if not (dfs(i + 1, j, k + 1) or dfs(i - 1, j, k + 1) or dfs(i, j + 1, k + 1) or dfs(i, j - 1, k + 1)): a.pop() return False else: # a.pop() return True # 主程序:循环矩阵搜索和第一个即word[0]匹配的,并进入dfs深度搜索函数。 for i in range(col): for j in range(row): if matrix[i][j] == word[0]: if dfs(i,j,0): return True return False