139. 单词拆分
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
- 拆分时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
示例 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
通过次数178,667提交次数348,864
法1 动态规划 时间序列增强版
思路
时间序列增强型。按照套路:
状态定义:
dp[i] :字符串s[0:i] 能否被拆分开来。
状态转移:
外层循环遍历i,内层循环在dp[0:i]之间找合适的j,使得s[0:j] 能被拆分,且s[j+1:i]又正好是一个出现在字典中的单词。那这样dp[i] 就必然等于True


题解
class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: s = '#' + s dp = [ False for _ in range(len(s))] dp[0] = True for i in range(1, len(dp)): # j 指向上一个单词的末尾 for j in range(0, i): if dp[j] and s[j+1:i+1] in wordDict: dp[i] = True break return dp[-1]