题解 | #矩阵中的路径#

矩阵中的路径

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
全部评论

相关推荐

在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务