代码随想录算法训练营第四十六天 | 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()];
}

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

代码随想录

背包问题总结篇!

代码随想录

相关推荐
code bean14 小时前
平衡相关性与多样性:推荐系统中的永恒博弈与 MMR 算法详解
算法
青梅橘子皮14 小时前
Linux---进程控制(2)(进程程序替换)
linux·c++·算法
Shan120514 小时前
经典问题——验证栈序列
数据结构·算法
2501_9065651214 小时前
勾股定理证明
算法
Shan120515 小时前
无向图的Hierholzer算法流程(二)
算法
gihigo199815 小时前
基于蒙特卡洛的异常值剔除(RANSAC + MC置信区间)—MATLAB实现
开发语言·算法·matlab
Asize15 小时前
数组数据结构底层:从灵活到陷阱
前端·javascript·算法
hairenwangmiao16 小时前
B4041 [GESP202409 四级] 区间排序
算法·排序
人道领域16 小时前
【LeetCode刷题日记】47.全排列Ⅱ
java·开发语言·算法·leetcode
漂流瓶jz16 小时前
UVA-1606 两亲性分子 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·向量·aoapc·算法竞赛入门经典·atan2·浮点