Leetcode - 139
此题乍一看不知道是背包问题,但是如果用背包问题来做,这首先是一个完全背包,因为字典中的字符串可以无限次使用,其次,只有按固定顺序去组装才可能满足目标串,所以这是一个排列问题。
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
#首先明确dp数组的含义,dp[i],代表字符串的第i个位置处,也就是0~i组成的子串是否能由字典中的字符串组成,所以类型是bool形
dp = [False] * (len(s)+1)
#这里是为了后面的递归所设定的,dp[0]没有任何含义
dp[0] = True
#由于是排列问题,所以背包作为外层循环
for j in range(1,len(dp)):
#这里的设定是i小于等于j,如果dp[i]==True且i~j组成的子串也存在于字典中,那么0~j组成的子串肯定也能由字典中的串来构建,所以dp[j] == True. 此题比较灵活,这里商品的定义并不明确
for i in range(j+1):
subStr = s[i:j]
if dp[i] == True and subStr in wordDict:
dp[j] = True
return dp[-1]