news 2026/4/17 22:36: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/4/17 3:20:00

Stream-rec直播录制工具:从入门到精通的完整使用指南

Stream-rec直播录制工具&#xff1a;从入门到精通的完整使用指南 【免费下载链接】stream-rec Automatic streaming record tool powered by FFmpeg. 虎牙/抖音/斗鱼/Twitch/PandaTV直播&#xff0c;弹幕自动录制 项目地址: https://gitcode.com/gh_mirrors/st/stream-rec …

作者头像 李华
网站建设 2026/4/17 9:05:46

Degrees of Lewdity中文版终极安装教程

Degrees of Lewdity中文版终极安装教程 【免费下载链接】Degrees-of-Lewdity-Chinese-Localization Degrees of Lewdity 游戏的授权中文社区本地化版本 项目地址: https://gitcode.com/gh_mirrors/de/Degrees-of-Lewdity-Chinese-Localization 想要轻松玩转Degrees of L…

作者头像 李华
网站建设 2026/4/13 17:19:53

Serverless RL,一种更快、更便宜、更灵活的强化学习训练方法

强化学习&#xff08;RL&#xff09;与无服务器技术&#xff08;Serverless&#xff09;的融合正在通过解耦算法复杂性与底层硬件管理&#xff0c;彻底改变智能体的开发与模型部署流程 。这种融合使开发过程从依赖固定、昂贵的计算集群转向了敏捷、弹性且按需驱动的现代范式。0…

作者头像 李华
网站建设 2026/4/16 18:07:45

音频格式转换神器:3分钟搞定QQ音乐加密文件终极解决方案

音频格式转换神器&#xff1a;3分钟搞定QQ音乐加密文件终极解决方案 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 还在为QQ音乐的加密音频无法在其他播放器上播放而烦恼吗…

作者头像 李华
网站建设 2026/4/15 12:23:27

GKD订阅管理2025:5分钟快速配置与智能维护指南

GKD订阅管理2025&#xff1a;5分钟快速配置与智能维护指南 【免费下载链接】GKD_THS_List GKD第三方订阅收录名单 项目地址: https://gitcode.com/gh_mirrors/gk/GKD_THS_List GKD订阅管理工具是专为GKD用户设计的订阅资源聚合平台&#xff0c;通过统一的收录标准和智能…

作者头像 李华