力扣:(79)单词搜索(Python)

描述:

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

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

思路:

  • 遍历网格,找到 word[0] 的起始位置

  • 用 DFS 搜索四个方向(上下左右),匹配 word 的后续字符。

  • 回溯(Backtracking)

    • 避免重复使用同一个单元格。

    • 如果匹配失败,撤销当前选择。

代码:

class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        m, n = len(board), len(board[0])
        
        def dfs(x, y, index):
            # 终止条件:找到完整单词
            if index == len(word):
                return True
            
            # 越界 or 不匹配
            if x < 0 or x >= m or y < 0 or y >= n or board[x][y] != word[index]:
                return False

            # 标记当前单元格(避免重复使用)
            temp, board[x][y] = board[x][y], "#"

            # 递归搜索四个方向
            found = (dfs(x+1, y, index+1) or 
                     dfs(x-1, y, index+1) or 
                     dfs(x, y+1, index+1) or 
                     dfs(x, y-1, index+1))

            # 恢复现场(回溯)
            board[x][y] = temp
            return found

        # 遍历整个网格,寻找起点
        for i in range(m):
            for j in range(n):
                if dfs(i, j, 0):  
                    return True
        
        return False

示例:

board = [
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]
word = "ABCCED"
从 board[0][0] = 'A' 开始匹配 word[0] = 'A'。

递归向右搜索 'B' -> 'C' -> 'C' -> 'E' -> 'D',成功找到 word = "ABCCED"。

复杂度分析:

  • 时间复杂度O(m * n * 4^k)m*n 遍历整个网格,4^k 为 DFS 递归深度(kword 长度)。

  • 空间复杂度O(k),递归栈深度最多 k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值