美文网首页
12. 矩阵中的路径

12. 矩阵中的路径

作者: oneoverzero | 来源:发表于2020-02-02 16:01 被阅读0次

题目描述:

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

LeetCode 代码:

class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        for i in range(len(board)):
            for j in range(len(board[0])):
                if board[i][j] == word[0] and self.explore(board, i, j, word[1:]):
                    return True
        return False
    
    def explore(self, board, i, j, word):
        if not word:
            return True
        temp, board[i][j] = board[i][j], '#'
        success = False
        for x, y in [(i+1, j), (i-1, j), (i, j+1), (i, j-1)]:
            if 0<=x<len(board) and 0<=y<len(board[0]) and board[x][y]==word[0] and \
               self.explore(board, x, y, word[1:]):
                success = True
                break
        board[i][j] = temp
        return success

牛客网代码(牛客网上输入的矩阵是以字符串的形式给定的,所以需要做一些调整):

class Solution:
    def hasPath(self, matrix, rows, cols, path):
        matrix = list(matrix)
        for i in range(rows):
            for j in range(cols):
                if matrix[i*cols+j] == path[0] and self.explore(matrix, rows, cols, i, j, path[1:]):
                    return True
        return False
    
    def explore(self, matrix, rows, cols, i, j, path):
        if not path:
            return True
        temp, matrix[i*cols+j] = matrix[i*cols+j], '#'
        success = False
        for x, y in [(i+1, j), (i-1, j), (i, j+1), (i, j-1)]:
            if 0<=x<rows and 0<=y<cols and matrix[x*cols+y]==path[0] and \
               self.explore(matrix, rows, cols, x, y, path[1:]):
                success = True
                break
        matrix[i*cols+j] = temp
        return success

总结:

回溯法适用于这样的问题:

  • 这个问题可能要分很多步才能完成;
  • 每一步都有很多种可能,而且即使这一步确定了,下一步还是会有很多种可能。

矩阵中的路径问题是典型的可以用回溯法解决的问题,通常回溯法适合用递归实现代码。当我们到达某一个节点时,尝试所有可能的选项并在满足条件的前提下递归地抵达下一个节点。

相关文章

  • 12. 矩阵中的路径

    题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母...

  • 12. 矩阵中的路径

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 ...

  • ARTS 20201218-1231

    Algorithm: 每周至少做一个 LeetCode 的算法题剑指 Offer 12. 矩阵中的路径[https...

  • 算法-12.矩阵中的路径

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步...

  • 12.矩阵路径

    思路: 使用回溯算法 回溯算法的实现方式是利用递归 可以借助画树形图来分析所需要的变量和条件 具体细节: 定义好终...

  • 面试题12. 矩阵中的路径

    矩阵中的路径 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵...

  • 剑指 Offer 12. 矩阵中的路径

    和求岛屿的数量那类型题一样,都是利用了dfs和回溯 在回溯的时候,将board[i][j]沉没后,记得在dfs后要恢复

  • 剑指 Offer 12. 矩阵中的路径

    题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,...

  • 《剑指offer》12.矩阵中的路径

    这道题思路其实是很简单的,就是回溯法。先找到第一个匹配的字符,然后从它的四周找下一个字符,如果找到了,接着往下找。...

  • 面试题12. 矩阵中的路径

    题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,...

网友评论

      本文标题:12. 矩阵中的路径

      本文链接:https://www.haomeiwen.com/subject/spsqxhtx.html