题目描述
给你一个字符串 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)创建一个dp全部为False
2) 初始化dp[0]=True
3)遍历背包(s),遍历物品(字典)
4)如果当前的索引已经够一个单词的长度,就可以进入dp试试。
5)dp[j] = dp[j] or (dp[j-len(word)] and word == s[j-len(word):j]) 等于True:去掉这个单词之前的dp[i]是True并且当前这个单词和s后续的一样
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
dp = [False]*(len(s)+1)
dp[0]=True
for j in range(1,len(s)+1):
for word in wordDict:
if j>=len(word):
dp[j] = dp[j] or (dp[j-len(word)] and word == s[j-len(word):j])
# dp[j]:因为字典中有多个单词,其中一个为true,就返回true,所以加上dp[j]
return dp[-1]
if __name__ == '__main__':
s = Solution()
ss = "leetcode1"
wordDict = ["leet", "code1"]
print(s.wordBreak(ss, wordDict))