剑指 Offer 12. 矩阵中的路径

题目描述

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

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

例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。

示例 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
board 和 word 仅由大小写英文字母组成

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决方法

方法一:深度优先搜索+剪枝

思路:遍历二维数组中的每一个元素作为起始元素,然后深度优先搜索,其中设置三个参数:i,j,k,分别表示二维数组的横坐标,纵坐标和word中的元素位置,如果i,j超出取值范围或者i,j对应二维数组中的元素和k对应的word中的元素如果不相等,则结束继续搜索,如果k对应为word的长度减1,则返回找到。如果遍历完后还未找到,则返回没找到。在深度优先搜索过程中,如果遍历过某个元素,则置为”,后续回溯的时候记得还原回原来的元素。

代码:

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        def dfs(i, j, k):
            if not 0<=i<len(board) or not 0<=j<len(board[0]) or board[i][j] != word[k]:
                return False
            if k == len(word) - 1:
                return True
            board[i][j] = ''
            res = 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)
            board[i][j] = word[k]
            return res
        for i in range(len(board)):
            for j in range(len(board[0])):
                if dfs(i, j, 0):
                    return True
        return False

复杂度分析:

  • 时间复杂度:O(3^K MN),其中M,N为二维数组的row,col长度,K为word长度,因为每一次有上下左右四个方向选择,考虑上一个字符来的方向,因此有3种选择
  • 空间复杂度:O(K)

发表评论