当前位置: 首页 > news >正文

动态规划题解——单词拆分【LeetCode】

139. 单词拆分


一、算法逻辑(逐步思路)

❓ 题目描述:

给定一个字符串 s 和一个单词字典 wordDict,判断是否可以s 拆分为若干个字典中的单词


✅ 解题思路(自顶向下 DFS + 缓存)

1. 目标定义:
  • 使用递归函数 dfs(i) 表示:s[:i] 是否可以合法拆分。
    • 比如:dfs(5) 表示 s[0:5] 能否由字典中的单词拼出。
2. 边界条件:
  • dfs(0) = True,表示空字符串总是可以被拆分(“啥也不选”是合法的)。
3. 遍历决策:
  • 每次从位置 i-1 向前遍历,尝试找一个单词 s[j:i] 满足:
    • s[j:i] in wordDict
    • dfs(j) 为真,即 s[0:j] 可拆分;
  • 一旦找到一个合法的切割点 j,就返回 True
  • 如果尝试了所有切割点都失败,返回 False
4. 剪枝优化:
  • max_len = max(len(w) for w in wordDict) 限制滑窗最大宽度,避免无效子串。
5. 记忆化搜索:
  • 使用 @cache 缓存子问题结果,避免重复计算,提高效率。

二、算法核心点

✅ 核心思想:区间划分 + 记忆化搜索

  • 本质是一个字符串划分问题,子问题是 s[:i] 能否拆分;
  • 对每个位置 i,尝试所有可能的前缀切割;
  • 每个子串 s[j:i] 都在尝试“是否能作为字典中一个词结尾”,并递归验证前缀 s[:j]
  • 使用缓存(记忆化)避免重复递归是性能提升关键。
class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:max_len = max(map(len, wordDict))words = set(wordDict)@cachedef dfs(i:int)-> bool:if i == 0:return Truefor j in range(i-1, max(i-max_len-1, -1), -1):if s[j:i] in words and dfs(j):return Truereturn Falsereturn dfs(len(s))

三、复杂度分析

  • 时间复杂度:O(n × L)
    • n = len(s),L 为字典中最长单词的长度;
    • 每个位置最多尝试 L 次切分;
    • 总状态数为 O(n),每个状态计算最多 O(L),配合缓存只算一次。
  • 空间复杂度:O(n)
    • 用于递归栈(最多深度 n);
    • 缓存最多存 n 个状态。

总结表:

维度

内容

✅ 思路逻辑

从后向前切割字符串,判断是否可以用字典中单词组成

✅ 核心技巧

DFS + 记忆化搜索;利用 max_len 限制枚举范围,提高效率

✅ 时间复杂度

O(n × L),n 是字符串长度,L 是最长单词长度

✅ 空间复杂度

O(n),递归栈和缓存


💡 小拓展:

  • 如果你想要得到所有可拆分方式,可以改写为返回列表;
  • 如果你更倾向于迭代写法(DP 表),也可以用一维 dp[i] 表示 s[:i] 是否可拆分,时间复杂度类似。
http://www.dtcms.com/a/278814.html

相关文章:

  • openEuler系统PCIE降速方法简介
  • 【2025/07/14】GitHub 今日热门项目
  • Self - RAG工作步骤
  • 【HTML】五子棋(精美版)
  • 【Java EE】多线程-初阶 认识线程(Thread)
  • 【C语言进阶】指针面试题详解(2)
  • 面试 | JS 面试题 整理(更ing)2/34
  • Android 16系统源码_窗口动画(二)窗口显示动画源码调用流程
  • 护照阅读器:国外证件识别的 OCR “解码师”
  • Python 中调用阿里云 OCR(Optical Character Recognition,光学字符识别)服务
  • STM32介绍和GPIO
  • stm32-Modbus主机移植程序理解以及实战
  • argus/nvarguscamerasrc 远程显示报错
  • 项目一第一天
  • 纯数学专业VS应用数学专业:这两个哪个就业面更广?
  • C++后端面试八股文
  • Linux 基础命令详解:从入门到实践(1)
  • JAVA 并发 ThreadLocal
  • RestAssured(Java)使用详解
  • 19.数据增强技术
  • 管程! 解决互斥,同步问题的现代化手段(操作系统os)
  • Java行为型模式---模板方法模式
  • Imx6ull用网线与电脑连接
  • SpringBoot JAR 反编译替换文件
  • 【嵌入式汇编基础】-操作系统基础(三)
  • 【每日刷题】移动零
  • LabVIEW-Origin 船模数据处理系统
  • 【爬虫】Python实现爬取京东商品信息(超详细)
  • 期权和期货的区别主要是什么?
  • [论文阅读] 人工智能 | 用大型语言模型玩转多语言主观性检测:CheckThat! 2025赛事中的亮眼表现