js统计网站访问人数,网络销售招聘,阿里云 多域名解析 到不同的网站,建设银行个人网上银行登录给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。
注意#xff1a;不要求字典中出现的单词全部都使用#xff0c;并且字典中的单词可以重复使用。
示例 1#xff1a;
输入: s 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 3001 wordDict.length 10001 wordDict[i].length 20s和wordDict[i]仅由小写英文字母组成wordDict中的所有字符串互不相同解题思路动态规划定义状态设dp[i]表示 “字符串s的前i个字符是否能被字典中的单词拼接而成”。初始化dp[0] True空字符串默认可以被拆分其余dp[i]初始化为False。状态转移遍历字符串的每个位置i从 1 到len(s)对每个单词word若i ≥ len(word)且dp[i - len(word)]为True同时s[i - len(word):i] word则将dp[i]设为True。结果最终返回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测试用例1s{s1}, wordDict{wordDict1}) print(f是否可拆分{solution.wordBreak(s1, wordDict1)}) # 预期输出True # 测试用例2可拆分单词重复使用 s2 applepenapple wordDict2 [apple, pen] print(f\n测试用例2s{s2}, wordDict{wordDict2}) print(f是否可拆分{solution.wordBreak(s2, wordDict2)}) # 预期输出True # 测试用例3不可拆分题目示例3 s3 catsandog wordDict3 [cats, dog, sand, and, cat] print(f\n测试用例3s{s3}, wordDict{wordDict3}) print(f是否可拆分{solution.wordBreak(s3, wordDict3)}) # 预期输出False # 测试用例4边界场景 - 空字符串 s4 wordDict4 [a, b] print(f\n测试用例4s{s4}, wordDict{wordDict4}) print(f是否可拆分{solution.wordBreak(s4, wordDict4)}) # 预期输出True # 测试用例5边界场景 - 字典无匹配单词 s5 hello wordDict5 [hi, world] print(f\n测试用例5s{s5}, wordDict{wordDict5}) print(f是否可拆分{solution.wordBreak(s5, wordDict5)}) # 预期输出FalseLeetCode提交代码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]程序运行结果展示测试用例1sleetcode, wordDict[leet, code] 是否可拆分True 测试用例2sapplepenapple, wordDict[apple, pen] 是否可拆分True 测试用例3scatsandog, wordDict[cats, dog, sand, and, cat] 是否可拆分False 测试用例4s, wordDict[a, b] 是否可拆分True 测试用例5shello, wordDict[hi, world] 是否可拆分False总结本文介绍了一个字符串拆分问题判断给定字符串s是否能由字典wordDict中的单词拼接而成单词可重复使用。采用动态规划解法定义dp[i]表示s前i个字符能否被拆分初始化dp[0]True通过遍历字符串位置和字典单词进行状态转移。Python实现中优化了字典查找效率并处理了边界条件。测试用例验证了算法的正确性包括常规可拆分、单词重复使用、不可拆分及空字符串等场景。最终返回dp[n]作为结果时间复杂度为O(n*m)其中n为字符串长度m为字典单词数。