这道题首先想到的是 :回溯+剪枝的方法,但好像还是不对,应该是剪枝的部分有问题,要存储每一步的startindex
后来看了题解的dp感觉就明白了,以目标字符串的位数去做,遍历两次,就可以得到结果
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
dp = [False] *(len(s)+1)
dp[0] = True
for i in range(len(s)+1):
for j in range(i):
if s[j:i] in wordDict and dp[j] == True:
dp[i] = True
return (dp[len(s)])
剩下的是背包问题的复习,我个人认为在递推公式这里更为重要
问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
问装满背包有几种方法:dp[j] += dp[j - nums[i]]
问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);