单词拆分 II-LeetCode
140. 单词拆分 II - Word Break II
🎯 问题描述(来源于LeetCode)
描述:
给定一个字符串 s 和一个字符串列表 wordDict,将 s 拆分成一个或多个在字典中出现的单词,返回所有可能的句子。
单词可以重复使用,且拆分后的单词按原顺序组成句子,单词之间用空格分隔。
说明:
- 字典中的单词互不相同。
- 同一个单词可以在拆分中多次使用。
示例:
- 示例 1:
1 | 输入: s = "catsanddog", wordDict = ["cat","cats","and","sand","dog"] |
- 示例 2:
1 | 输入: s = "pineapplepenapple", wordDict = ["apple","pen","applepen","pine","pineapple"] |
- 示例 3:
1 | 输入: s = "catsandog", wordDict = ["cats","dog","sand","and","cat"] |
💻 解题思路
思路:回溯法(DFS)枚举单词分割
算法步骤
- 将
wordDict转换为集合st,便于快速判断单词是否存在。 - 获取字符串长度
n,初始化结果列表ans和路径列表path。 - 定义递归函数
dfs(i, cur),其中i表示当前扫描到的下标,cur表示当前正在累积的字符(可能构成一个单词):- 如果
i == n(扫描完所有字符):- 如果
cur非空,且cur在字典中,则将其加入path,然后将path用空格连接成句子加入ans,最后回溯弹出cur。 - 如果
cur为空(即最后一段已经切分),则直接将path连接成句子加入ans。 - 返回。
- 如果
- 否则:
- 不切分:继续累积当前字符,递归
dfs(i+1, cur + s[i])。 - 切分:如果
cur非空且cur在字典中,则将cur加入path,然后从下一个字符开始新的累积,递归dfs(i+1, s[i]),最后回溯弹出path。
- 不切分:继续累积当前字符,递归
- 如果
- 从
dfs(0, "")开始搜索。 - 返回
ans。
代码实现
1 | from typing import List |
📊 性能分析
- 时间复杂度:最坏情况下为 ,但由于字典剪枝,实际运行较快。对于
n ≤ 20的输入,该解法可通过。 - 空间复杂度:,递归栈深度和路径存储。
思考
该解法模拟了回溯构造句子的过程,通过 cur 累积当前单词,在每次递归中决定是继续延长单词还是切分(如果当前累积的单词在字典中)。
优点:
- 代码结构清晰,直接模拟了人类构造句子的思维。
- 使用了
set快速判断单词是否存在。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






