单词搜索- python-dfs&剪枝

题目:

思路:

参考:https://leetcode.cn/problems/word-search/solutions/2361646/79-dan-ci-sou-suo-hui-su-qing-xi-tu-jie-5yui2/?envType=study-plan-v2&envId=top-100-liked

深度优先搜索(DFS)+ 剪枝

  • 深度优先搜索: 即暴力法遍历矩阵中所有字符串可能性。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜索,以此类推。
  • 剪枝: 在搜索中,遇到"这条路不可能和目标字符串匹配成功"的情况,例如当前矩阵元素和目标字符不匹配、或此元素已被访问,则应立即返回,从而避免不必要的搜索分支。

代码:

复制代码
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

算法解析:

  • 递归参数: 当前元素在矩阵 board 中的行列索引 ij ,当前目标字符在 word 中的索引 k

  • 终止条件:

    • false: ​​​​​​​ ​​​​​​​ (1) 行或列索引越界 (2) 当前矩阵元素与目标字符不同 (3) 当前矩阵元素已访问过 ( (3) 可合并至 (2) )

    • true: k = len(word) - 1 ,即字符串 word 已全部匹配。

  • 递推工作: ​​​​​​​

    • 标记当前矩阵元素: 将 board[i][j] 修改为 空字符 '' ,代表此元素已访问过,防止之后搜索时重复访问。

    • 搜索下一单元格: 朝当前元素的 上、下、左、右 四个方向开启下层递归,使用 或 连接 (代表只需找到一条可行路径就直接返回,不再做后续 DFS ),并记录结果至 res 。

    • 还原当前矩阵元素: 将 board[i][j] 元素还原至初始值,即 word[k]

  • 返回值: 返回布尔量 res ,代表是否搜索到目标字符串。

相关推荐
sonnet-10292 小时前
拓扑排序的实现
java·c语言·开发语言·笔记·算法
米粒12 小时前
力扣算法刷题 Day 20
算法·leetcode·职场和发展
Shining05962 小时前
推理引擎系列(七)《InfiniLM》
人工智能·深度学习·算法·大模型·ai芯片·智能体·推理引擎
马猴烧酒.2 小时前
【面试八股|计算机网络】计算机网络常见面试题详解笔记
java·开发语言·网络·笔记·计算机网络·算法·面试
北顾笙9802 小时前
测开准备-day04数据结构力扣
数据结构·算法·leetcode
千码君20162 小时前
kotlin:函数式参数
java·算法·kotlin
2401_833197732 小时前
现代C++多线程编程实战
开发语言·c++·算法
m0_587958952 小时前
C++中的适配器模式实战
开发语言·c++·算法
sprite_雪碧3 小时前
3.2 最大公约数(GCD)&斐波那契数列 & 素数相关(机试高频数学考点)
算法
2301_776508723 小时前
C++中的职责链模式实战
开发语言·c++·算法