单词搜索- 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 ,代表是否搜索到目标字符串。

相关推荐
octopus_c3 小时前
数据结构:堆(Heap)详解
c语言·数据结构·算法
YH55269848 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
遥感知识服务10 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶10 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆10 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
叩码以求索12 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
北风toto13 小时前
中缀、前缀、后缀表达式
算法·软件设计师
听取WA声一片(无恶意)13 小时前
CSP-J/CSP-S 深度优先搜索(DFS)完全讲义
c++·算法·深度优先
码流怪侠14 小时前
2026年8月GitHub热榜深度拆解:Agent Skills席卷开源圈,一个“技能包“收割5万星
算法·程序员·github
hold?fish:palm14 小时前
30 两两交换链表中的节点
数据结构·算法·链表