剑指Offer 12. 矩阵中的路径


一、题目

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

[[“a”,”b“,”c”,”e”],

[“s”,”f“,”c“,”s”],

[“a”,”d”,”e“,”e”]]

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

提示:

  • 1 <= board.length <= 200
  • 1 <= board[i].length <= 200

注意:本题与主站 79 题相同:https://leetcode-cn.com/problems/word-search/

二、思路

1. 深度优先搜索

原题解,点击查看

我们可以通过遍历数组board,找到word字符串的第一个字符,然后通过递归的方式在数组中匹配剩余的word字符。

具体看代码,逻辑清晰。

三、代码

1. 深度优先遍历

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        def recursion(i, j, cur):
            if not 0 <= i < m or not 0 <= j < n or board[i][j] != word[cur]:
                return False
            # 当前位置的字符与word字符匹配成功,并且当前为最后一个word字符
            if cur == len(word) - 1: return True
            # 将匹配的位置进行标记
            pre, board[i][j] = board[i][j], '1'
            # 左,右,上,下
            res = recursion(i, j-1, cur+1) or recursion(i, j+1, cur+1) or recursion(i-1, j, cur+1) or recursion(i+1, j, cur+1)
            # 恢复标记位置的值,否则会影响后续的匹配
            board[i][j] = pre
            return res
        # 行
        m = len(board)
        # 列
        n = len(board[0])

        for i in range(m):
            for j in range(n):
                # 行,列,word字符下标
                if recursion(i, j, 0):
                    return True
        return False

四、表现

method 运行时间 表现 内存消耗 表现
1. 深度优先搜索 188ms 97.13% 14.8MB 11.61%

文章作者: Arvin He
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Arvin He !
评论
 上一篇
剑指Offer 13. 机器人的运动范围 剑指Offer 13. 机器人的运动范围
一、题目地上有一个m行n列的方格,从坐标[0,0]到坐标[m-1,n-1]。一个机器人从坐标[0, 0]的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18
2020-10-27 Arvin He
下一篇 
剑指Offer 11. 旋转数组的最小数字 剑指Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1。
2020-10-27
  目录