news 2026/3/16 10:01:42

【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/3/14 6:13:55

如何快速实现输入法词库同步:跨平台完整指南

如何快速实现输入法词库同步&#xff1a;跨平台完整指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 深蓝词库转换工具是一款开源免费的输入法词库转换程序&#…

作者头像 李华
网站建设 2026/3/14 8:43:20

DeepSeek-R1-Distill-Llama-70B:推理效率新标杆

导语&#xff1a;DeepSeek-R1-Distill-Llama-70B模型正式亮相&#xff0c;通过创新蒸馏技术将大模型推理能力高效迁移至中等规模模型&#xff0c;在数学推理、代码生成等核心任务上实现性能突破&#xff0c;重新定义行业推理效率标准。 【免费下载链接】DeepSeek-R1-Distill-Ll…

作者头像 李华
网站建设 2026/3/14 9:23:02

手机号查QQ:3分钟快速找回关联账号的完整指南

手机号查QQ&#xff1a;3分钟快速找回关联账号的完整指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经因为忘记QQ号而无法登录&#xff1f;或者需要验证某个手机号是否绑定了QQ账号&#xff1f;手机号查QQ工具正是为解…

作者头像 李华
网站建设 2026/3/14 1:41:19

如何彻底解决订阅管理难题?GKD订阅管理2025终极指南

你是否曾经为订阅源分散、更新不及时、内容质量参差不齐而烦恼&#xff1f;GKD订阅管理工具正是为了解决这些问题而设计的智能化解决方案。通过统一的收录标准和自动化管理机制&#xff0c;让你告别繁琐的订阅配置过程&#xff0c;享受更加流畅、高效的GKD使用体验。 【免费下载…

作者头像 李华
网站建设 2026/3/12 19:16:16

47 Dockerfile场景化:公司内网业务上线(分角色/分模块)

文章目录一、总场景&#xff1a;公司内网业务上线&#xff08;分角色/分模块&#xff09;二、任务设计任务 1&#xff1a;镜像规范化&#xff08;所有镜像通用&#xff09;任务 2&#xff1a;sshd 镜像“安全化”改造&#xff08;不要把它当真实生产&#xff09;任务 3&#xf…

作者头像 李华
网站建设 2026/3/14 9:59:24

Windows热键冲突终极解决方案:高效排查多软件快捷键占用

你是否曾经遇到过这样的情况&#xff1a;按下熟悉的快捷键却没有任何反应&#xff1f;在同时运行多个软件的Windows环境中&#xff0c;热键冲突已成为影响工作效率的隐形障碍。今天&#xff0c;我将为你介绍一款专业的热键检测工具&#xff0c;彻底解决Windows热键冲突问题&…

作者头像 李华