news 2026/9/23 14:41:54

【LeetCode刷题】单词拆分

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【LeetCode刷题】单词拆分

给你一个字符串s和一个字符串列表wordDict作为字典。如果可以利用字典中出现的一个或多个单词拼接出s则返回true

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:

输入:s = "leetcode", wordDict = ["leet", "code"]输出:true解释:返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:

输入:s = "applepenapple", wordDict = ["apple", "pen"]输出:true解释:返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。 注意,你可以重复使用字典中的单词。

示例 3:

输入:s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]输出:false

提示:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • swordDict[i]仅由小写英文字母组成
  • wordDict中的所有字符串互不相同

解题思路(动态规划)

  1. 定义状态:设dp[i]表示 “字符串s的前i个字符是否能被字典中的单词拼接而成”。
  2. 初始化dp[0] = True(空字符串默认可以被拆分);其余dp[i]初始化为False
  3. 状态转移
    • 遍历字符串的每个位置i(从 1 到len(s));
    • 对每个单词word,若i ≥ len(word)dp[i - len(word)]True,同时s[i - len(word):i] == word,则将dp[i]设为True
  4. 结果:最终返回dp[len(s)](表示整个字符串是否能被拆分)。

Python代码:

from typing import List class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: """ 字符串拆分问题:判断字符串能否被字典中的单词拼接而成(单词可重复使用) :param s: 待拆分的目标字符串(非空/空字符串均可) :param wordDict: 单词字典列表(元素为非空字符串) :return: 布尔值,True表示可拆分,False表示不可拆分 """ # 边界条件1:空字符串默认可拆分(题目隐含规则) if not s: return True # 边界条件2:字典为空,且字符串非空 → 无法拆分 if not wordDict: return False # 优化1:转集合提升单词查找效率(O(1)) word_set = set(wordDict) # 优化2:统计字典中单词的最大长度,减少无效子串遍历 max_word_len = max(len(word) for word in wordDict) n = len(s) # dp[i] 表示s的前i个字符(s[0:i])能否被字典单词拆分 dp = [False] * (n + 1) dp[0] = True # 基准条件:空字符串可拆分 # 遍历字符串每个位置i(表示前i个字符) for i in range(1, n + 1): # 优化:仅遍历 i - max_word_len 到 i 的范围(超出字典单词长度的子串无需检查) start = max(0, i - max_word_len) for j in range(start, i): # 条件:前j个字符可拆分 + 子串s[j:i]在字典中 if dp[j] and s[j:i] in word_set: dp[i] = True break # 找到有效匹配,无需继续遍历 return dp[n] # ------------------- 测试用例 ------------------- if __name__ == "__main__": solution = Solution() # 测试用例1:常规可拆分(题目示例1) s1 = "leetcode" wordDict1 = ["leet", "code"] print(f"测试用例1:s='{s1}', wordDict={wordDict1}") print(f"是否可拆分:{solution.wordBreak(s1, wordDict1)}") # 预期输出:True # 测试用例2:可拆分(单词重复使用) s2 = "applepenapple" wordDict2 = ["apple", "pen"] print(f"\n测试用例2:s='{s2}', wordDict={wordDict2}") print(f"是否可拆分:{solution.wordBreak(s2, wordDict2)}") # 预期输出:True # 测试用例3:不可拆分(题目示例3) s3 = "catsandog" wordDict3 = ["cats", "dog", "sand", "and", "cat"] print(f"\n测试用例3:s='{s3}', wordDict={wordDict3}") print(f"是否可拆分:{solution.wordBreak(s3, wordDict3)}") # 预期输出:False # 测试用例4:边界场景 - 空字符串 s4 = "" wordDict4 = ["a", "b"] print(f"\n测试用例4:s='{s4}', wordDict={wordDict4}") print(f"是否可拆分:{solution.wordBreak(s4, wordDict4)}") # 预期输出:True # 测试用例5:边界场景 - 字典无匹配单词 s5 = "hello" wordDict5 = ["hi", "world"] print(f"\n测试用例5:s='{s5}', wordDict={wordDict5}") print(f"是否可拆分:{solution.wordBreak(s5, wordDict5)}") # 预期输出:False

LeetCode提交代码:

class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: # 将字典转为集合,优化查找效率 word_set = set(wordDict) n = len(s) # dp[i]表示s的前i个字符能否被拆分 dp = [False] * (n + 1) dp[0] = True # 空字符串默认可拆分 # 遍历每个位置i for i in range(1, n + 1): # 遍历每个单词,判断是否能匹配s的子串 for word in word_set: word_len = len(word) # 条件:当前位置i不小于单词长度 + 前i-word_len个字符可拆分 + 子串匹配单词 if i >= word_len and dp[i - word_len] and s[i - word_len:i] == word: dp[i] = True break # 找到一个有效匹配即可,无需继续遍历单词 return dp[n]

程序运行结果展示

测试用例1:s='leetcode', wordDict=['leet', 'code'] 是否可拆分:True 测试用例2:s='applepenapple', wordDict=['apple', 'pen'] 是否可拆分:True 测试用例3:s='catsandog', wordDict=['cats', 'dog', 'sand', 'and', 'cat'] 是否可拆分:False 测试用例4:s='', wordDict=['a', 'b'] 是否可拆分:True 测试用例5:s='hello', wordDict=['hi', 'world'] 是否可拆分:False

总结

本文介绍了一个字符串拆分问题,判断给定字符串s是否能由字典wordDict中的单词拼接而成(单词可重复使用)。采用动态规划解法,定义dp[i]表示s前i个字符能否被拆分,初始化dp[0]=True,通过遍历字符串位置和字典单词进行状态转移。Python实现中优化了字典查找效率,并处理了边界条件。测试用例验证了算法的正确性,包括常规可拆分、单词重复使用、不可拆分及空字符串等场景。最终返回dp[n]作为结果,时间复杂度为O(n*m),其中n为字符串长度,m为字典单词数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/22 1:09:52

Python适合开发的游戏

Python 凭借简洁的语法、丰富的游戏开发库 / 框架&#xff0c;以及快速迭代的优势&#xff0c;非常适合开发中小型游戏、2D 游戏、文字类游戏、游戏原型&#xff0c;但受限于性能&#xff08;GIL 限制&#xff09;&#xff0c;不适合开发大型 3A、高帧率竞技类游戏。以下是 Pyt…

作者头像 李华
网站建设 2026/9/22 18:42:11

智能家居中枢:本地化语音理解靠TensorRT实现

智能家居中枢&#xff1a;本地化语音理解靠TensorRT实现 在智能音箱刚兴起的那几年&#xff0c;用户对“唤醒慢”“断网就失灵”“总误唤醒”这些问题抱怨不断。背后的核心矛盾其实很清晰&#xff1a;把语音数据传到云端处理&#xff0c;虽然算力不成问题&#xff0c;但代价是隐…

作者头像 李华
网站建设 2026/9/22 5:50:42

ST7789V LCD驱动板引脚规划:项目应用

ST7789V驱动LCD怎么接&#xff1f;别再瞎连了&#xff01;一个引脚错&#xff0c;屏幕就花屏你有没有遇到过这种情况&#xff1a;辛辛苦苦写好UI代码&#xff0c;烧录进ESP32或STM32&#xff0c;结果屏幕要么不亮、要么花屏、偶尔白屏重启……最后发现&#xff0c;不是代码的问…

作者头像 李华
网站建设 2026/9/20 18:52:16

推理耗时下降80%:某初创公司使用TensorRT的真实反馈

推理耗时下降80%&#xff1a;某初创公司使用TensorRT的真实反馈 在一家AI视觉初创公司的开发会议室里&#xff0c;工程师们正盯着监控面板上跳动的延迟指标。他们刚上线的新一代安防分析系统&#xff0c;需要在单张T4 GPU上实时处理四路1080p视频流——而原始模型每帧耗时超过8…

作者头像 李华
网站建设 2026/9/20 22:19:09

银行智能理财顾问:低延迟对话背后的秘密武器

银行智能理财顾问&#xff1a;低延迟对话背后的秘密武器 在手机银行App中输入一句“我想买一只稳健型基金&#xff0c;年化收益5%左右”&#xff0c;不到一秒就收到专业且条理清晰的推荐方案——这背后并非简单的问答匹配&#xff0c;而是一场在毫秒之间完成的复杂AI推理。用户…

作者头像 李华
网站建设 2026/9/20 22:14:48

USB数据包传输时序分析:系统学习硬件同步机制

USB数据包传输时序深度解析&#xff1a;从硬件同步到驱动实战 你有没有遇到过这样的情况&#xff1f;USB设备在实验室测试一切正常&#xff0c;一拿到客户现场就频繁掉线、枚举失败&#xff0c;甚至音频播放断断续续像“卡碟”&#xff1f;更离谱的是&#xff0c;换根线就好了—…

作者头像 李华