【leetcode】139. 单词拆分
文章目录
- 题目
- 题解
- 1. 动态规划
- 2. 回溯
题目
139. 单词拆分
给你一个字符串 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
题解
- 动态规划
- 遍历字符串,判断截取的是否在word_set中
dp[0] = True
1. 动态规划
class Solution(object):def wordBreak(self, s, wordDict):""":type s: str:type wordDict: List[str]:rtype: bool"""word_set = set(wordDict)n = len(s)dp = [False] * (len(s) + 1)dp[0] = True# dp[i] = dp[i - 1] and s[j:i] in wordDictfor i in range(1, len(s) + 1):for j in range(i):if dp[j] and s[j : i] in word_set:dp[i] = Truebreakreturn dp[n]
链接
2. 回溯
class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:import functools@functools.lru_cache(None)def back_track(s):if(not s):return Trueres=Falsefor i in range(1,len(s)+1):if(s[:i] in wordDict):res=back_track(s[i:]) or resreturn resreturn back_track(s)