139. 单词拆分
1. first idea
我认为,可以直接使用字典wordDict作为物品列表,
而字符串s是背包。
我们可以遍历物品作为外层循环,内层循环是从头开始到j位置组成的连续子串的长度不断增长。
如果s[j - len(word):j] 与 一个字符串是匹配的,那么dp[j]就与dp[j-len(word)]相同.
否则dp[j]=False
初始化则对于dp[0]设为True,因为它表示子串为空时,当前字典能否组成这个子串。 为了让任意单词与自己匹配时能返回True,我们必须先假定空串是True,不然没办法推。
但是由于字典中的单词能够重复使用,应该调整循环顺序,外层应该是字串长度,内层应该是字典单词遍历。
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
dp = [False] * (len(s) + 1)
dp[0] = True
for j in range(1, len(s) + 1):
for word in wordDict:
# print(max(j - len(word), 0), j, s[max(j - len(word), 0): j], word)
if (dp[j] == False) and (s[max(j - len(word), 0): j] == word):
# 有可能本来匹配过,已经是True的位置,被再次匹配重新赋值为False。所以加入判断条件。
# print("equal", j)
dp[j] = dp[max(j - len(word), 0)]
# print(dp)
return dp[-1]