剑指Offer 12. 矩阵中的字符串路径(M)/ 212. 单词搜索 II(H)

剑指Offer 12. 矩阵中的字符串路径 == 79. 单词搜索(M)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution:
    ### 1114 DFS + 回溯法(200 ms,14.9 MB)
    def exist(self, board: List[List[str]], word: str) -> bool:
        # dfs表示从某行某列开始的一次的递归搜索结果
        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

            # 若路径已匹配完整,则返回True
            if k == len(word) - 1: return True

            # 开始下轮递归搜索之前,需要先标记已经搜索过的字符(题目要求不能经过重复的字符),这里将其置为空字符串作为标记
            board[i][j] = ''
            # 开始下一轮递归搜索,只要有一个方向搜索成功,则返回True
            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                         # 若遍历完整个矩阵都没有匹配成功,则不存在合法路径,返回False

212. 单词搜索 II

在这里插入图片描述

class Trie:
    def __init__(self):
        self.children = defaultdict(Trie)
        self.word = ""

    def insert(self, word):
        cur = self
        for c in word:
            cur = cur.children[c]
        cur.is_word = True
        cur.word = word

class Solution:
    def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:
        trie = Trie()
        for word in words:
            trie.insert(word)

        def dfs(now, i1, j1):
            if board[i1][j1] not in now.children:
                return

            ch = board[i1][j1]
            now = now.children[ch]
            if now.word != "":
                ans.add(now.word)

            board[i1][j1] = "#"
            for i2, j2 in [(i1 + 1, j1), (i1 - 1, j1), (i1, j1 + 1), (i1, j1 - 1)]:
                if 0 <= i2 < m and 0 <= j2 < n:
                    dfs(now, i2, j2)
            board[i1][j1] = ch

        ans = set()
        m, n = len(board), len(board[0])

        for i in range(m):
            for j in range(n):
                dfs(trie, i, j)

        return list(ans)

在这里插入图片描述

  • 方法2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值