单词拆分
1.把单词看成物品,字符串看成背包—>完全背包问题
2.排列问题:因为物品之间的组成顺序很重要,所以需要考虑顺序 。因为"apple" + “apple” + “pen” 或者 “pen” + “apple” + “apple” 是不可以的
d[j]:字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词如果确定dp[i] 是true,且 [i, i] 这个区间的子串出现在字典里,那么dp[j]一定是true。。 所以递推公式是 if([i,
j] 这个区间的子串出现在字典里 && dp[i]是true) 那么 dp[j] = true。
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
# dp[i]:字符串中前i个单词是否可以被拆成单词
wordSet = set(wordDict) # 单词是可以重复使用的,所以取集合即可
n = len(s)
dp = [False] * (n + 1) # dp[i] 表示字符串的前 i 个字符是否可以被拆分成单词
dp[0] = True # 初始状态,空字符串可以被拆分成单词
# s[i:j]这段字符串的状态 即dp[j]取决于dp[i]
for j in range(n+1):
for i in range(j):
if s[i:j] in wordSet and dp[i]==True:
dp[j]=True
break
return dp[n]
多重背包
每个物品不是只有一个也不是有无限个,而是有不同的个数要求
代码随想录
具体解法可以先按照0-1背包的方法遍历,然后再嵌套一个个数的循环