当前位置: 首页 > 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.lryc.cn/news/588033.html

相关文章:

  • 【字节跳动】数据挖掘面试题0017:推荐算法:双塔模型,怎么把内容精准地推送给用户
  • 设计模式(行为型)-迭代器模式
  • iOS App 安全加固全流程:静态 + 动态混淆对抗逆向攻击实录
  • Linux进程优先级机制深度解析:从Nice值到实时调度
  • 基于MATLAB的LSTM长短期记忆神经网络的时间序列数据预测方法应用
  • .NET ExpandoObject 技术原理解析
  • C#/.NET/.NET Core技术前沿周刊 | 第 46 期(2025年7.7-7.13)
  • 如何用深度学习实现图像风格迁移
  • 面试150 路径总和
  • 电脑升级Experience
  • WPF自定义日历选择控件
  • ZYNQ双核通信终极指南:FreeRTOS移植+OpenAMP双核通信+固化实战
  • spark广播表大小超过Spark默认的8GB限制
  • 大数据系列之:通过trino查询hive表
  • pyspark中map算子和flatmap算子
  • kettle从入门到精通 第103课 ETL之kettle kettle读取redis中的Hash数据
  • IOS开发者账号如何添加 uuid 原创
  • 图机器学习(1)——图论基础
  • [硬件电路-22]: 为什么模拟电路信号处理运算的精度不如数字信号处理运算?
  • flink 中配置hadoop 遇到问题解决
  • 基于MaxCompute MaxFrame 汽车自动驾驶数据预处理最佳实践
  • WST2078 N+P 双通道 MOSFET 在蓝牙耳机中的技术适配
  • FreeSWITCH fifo模块排队并动态播放排队位置
  • 12.如何判断字符串是否为空?
  • AI驱动的软件工程(下):AI辅助的质检与交付
  • SpringBoot 整合 MyBatis-Plus
  • 智源全面开源RoboBrain 2.0与RoboOS 2.0:刷新10项评测基准,多机协作加速群体智能
  • LangChain面试内容整理-知识点16:OpenAI API接口集成
  • docker-compose 安装Alist
  • rk3588ubuntu 系统移植AIC8800D Wi-Fi6/BT5.0芯片