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

动态规划题解——单词拆分【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.xdnf.cn/news/15337.html

相关文章:

  • VScode链接服务器一直卡在下载vscode服务器,无法连接成功
  • 企业数字化资产管理安全、成本、协作困局难解?
  • MYSQL数据库----DCL语句
  • Linux进程状态实战指南:转换关系、监控命令与状态解析
  • 从代码学习深度强化学习 - DDPG PyTorch版
  • python赤道上空的大气环流剖面图(纬向-高度剖面)
  • 代理模式:控制对象访问
  • Spring AI 项目实战(十七):Spring Boot + AI + 通义千问星辰航空智能机票预订系统(附完整源码)
  • 无缝衔接直播流体验
  • 数据结构 单链表(1)
  • Acrobat 表单中的下拉菜单(附示例下载)
  • ESP-Timer入门(基于ESP-IDF-5.4)
  • 插入类排序的C语言实现
  • Java小白-设计模式
  • C#单例模式管理全局变量
  • OSPF与BGP的联动特性实验案例
  • OSPF与BGP的联动特性
  • Java设计模式之行为型模式(命令模式)
  • 单例模式:确保全局唯一实例
  • Vue文件上传实战指南
  • 【OpenGL 渲染器开发笔记】1 为什么要设计渲染器?
  • Dubbo-Admin 安装与使用指南:可视化管理 Dubbo 服务
  • 初识drag2框架,drag2注入的基本原理
  • 常用的docker命令备份
  • k8s:0/1 nodes are available: pod has unbound immediate PersistentVolumeClaims.
  • 论文Review 3DGSSLAM GauS-SLAM: Dense RGB-D SLAM with Gaussian Surfels
  • 使用python操作文件夹
  • Hashtable 与 HashMap 的区别笔记
  • [GWCTF 2019]我有一个数据库
  • 05.判断日期是工作日还是周末