【代码随想录】day46:单词拆分,多重背包

单词拆分

在这里插入图片描述

1.把单词看成物品,字符串看成背包—>完全背包问题
2.排列问题:因为物品之间的组成顺序很重要,所以需要考虑顺序 。因为"apple" + “apple” + “pen” 或者 “pen” + “apple” + “apple” 是不可以的
d[j]:字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词

如果确定dp[i] 是true,且 [i, i] 这个区间的子串出现在字典里,那么dp[j]一定是true。。 所以递推公式是 if([i,
j] 这个区间的子串出现在字典里 && dp[i]是true) 那么 dp[j] = true。

def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: List[str]
        :rtype: bool
        """

        # dp[i]:字符串中前i个单词是否可以被拆成单词

        wordSet = set(wordDict) # 单词是可以重复使用的,所以取集合即可


        n = len(s)
        dp = [False] * (n + 1)  # dp[i] 表示字符串的前 i 个字符是否可以被拆分成单词
        dp[0] = True  # 初始状态,空字符串可以被拆分成单词


        # s[i:j]这段字符串的状态 即dp[j]取决于dp[i]
        for j in range(n+1):

            for i in range(j):

                if s[i:j] in wordSet and dp[i]==True:
                    dp[j]=True
                    break
        return dp[n]

多重背包

每个物品不是只有一个也不是有无限个,而是有不同的个数要求

代码随想录
具体解法可以先按照0-1背包的方法遍历,然后再嵌套一个个数的循环

在这里插入图片描述

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值