代码随想录算法训练营第四十六天 | 139.单词拆分 & 关于多重背包,你该了解这些! & 背包问题总结篇!

139.单词拆分

🔗题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

💡解题思路:动态规划

单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。

拆分时可以重复使用字典中的单词,说明就是一个完全背包!

动规五部曲分析如下:

1.确定dp数组以及下标的含义

dpi : 字符串长度为i的话,dpi为true,表示可以拆分为一个或多个在字典中出现的单词

2.确定递推公式

如果确定dpj 是true,且 j, i 这个区间的子串出现在字典里,那么dpi一定是true。(j < i )。

所以递推公式是 if(j, i 这个区间的子串出现在字典里 && dpj是true) 那么 dpi = true。

3.dp数组如何初始化

从递推公式中可以看出,dpi 的状态依靠 dpj是否为true,那么dp0就是递推的根基,dp0一定要为true,否则递推下去后面都都是false了。

那么dp0有没有意义呢?

dp0表示如果字符串为空的话,说明出现在字典里。

但题目中说了"给定一个非空字符串 s" 所以测试数据中不会出现i为0的情况,那么dp0初始为true完全就是为了推导公式。

下标非0的dpi初始化为false,只要没有被覆盖说明都是不可拆分为一个或多个在字典中出现的单词。

4.确定遍历顺序

题目中说是拆分为一个或多个在字典中出现的单词,所以这是完全背包。

还要讨论两层for循环的前后顺序。

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

本题其实我们求的是排列数,为什么呢。 拿 s = "applepenapple", wordDict = "apple", "pen" 举例。

"apple", "pen" 是物品,那么我们要求 物品的组合一定是 "apple" + "pen" + "apple" 才能组成 "applepenapple"。

"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序。

所以说,本题一定是 先遍历 背包,再遍历物品。

5.举例推导dpi

以输入: s = "leetcode", wordDict = "leet", "code"为例,dp状态如图:

dps.size()就是最终结果。

代码如下:

java 复制代码
public boolean wordBreak(String s, List<String> wordDict) {
        boolean[] dp = new boolean[s.length() + 1];
        dp[0] = true;

        //排列------先遍历背包,再遍历物品
        for (int i = 1; i <= s.length(); i++) {
            for (String word: wordDict) {
                int len = word.length();
                if (i >= len && dp[i - len] && word.equals(s.substring(i - len, i))) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.length()];
}

关于多重背包,你该了解这些!

代码随想录

背包问题总结篇!

代码随想录

相关推荐
罗西的思考21 分钟前
DreamZero 与 DreamDojo:世界模型与策略的分层协同综合分析与对比
人工智能·算法·机器学习
玖玥拾1 小时前
LeetCode 219 存在重复元素 II
算法·leetcode·哈希算法·散列表
知无不研2 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
a187927218313 小时前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
2601_962297483 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
辰烨chenye3 小时前
LeetCode Hot 100 题解 · 子串篇
算法·leetcode·职场和发展
辰烨chenye4 小时前
LeetCode Hot 100 题解 · 堆篇
java·算法·leetcode
手写码匠4 小时前
华为云Flexus+DeepSeek征文|DeepSeek 应用监控告警体系实战:从“用户投诉才知道“到“故障前就发现“
人工智能·深度学习·算法·aigc
shehuiyuelaiyuehao4 小时前
算法29,前缀和,除自身以外的数组的乘积
java·数据结构·算法
智购科技自动售货机厂家4 小时前
2026自动售货机设备清洁效果自动验证:从图像比对到评分算法的工程实践~YH
人工智能·算法·计算机视觉