139、单词拆分:
class Solution(object):
def wordBreak(self, s, wordDict):
"""
:type s: str
:type wordDict: List[str]
:rtype: bool
"""
n = len(s)
dp = [False] * (n + 1)
dp[0] = True
map_word = set(wordDict)
for j in range(1, n + 1):
for i in range(j):
if dp[i] == True and s[i:j] in map_word:
dp[j] = True
return dp[n]
本题状态转移方程需要遍历字符串,根据字符i和j之间的子字符串是否出现在字典中,来判断dp[j]的状态,感觉上确实不像是背包问题,没必要硬套
背包问题总结:
01背包和完全背包:
01背包的二维dp数组实现先遍历物品或背包都行,第二层循环遍历是从小到大;而一维dp数组实现是先遍历物品,后遍历背包,且背包遍历是从大到小;
完全背包问题要根据题目判断是组合还是排列问题,求组合数是先物品后背包,求排列数是先背包后物品,两层循环遍历均是从小到大。