代码随想录第46天| 139.单词拆分

103 阅读1分钟

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]