第40天|LeetCode139. 单词拆分、多重背包

news2024/11/26 4:51:55

1.题目链接:139. 单词拆分

题目描述:

                给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。

                注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

解法:

        1.五步曲:

                                ①将其转化为背包问题就是给定容量为s.size()的背包,问能不能把它装满。

                                ②dp[j]表示的就是根据wordDict字典能否填满容量为j的背包,能的话dp[j] = true;不能的话就是false。

                                ③递推公式:dp[j] = ? 假设一段上要求dp[j],那么在j之前有个位置i,当dp[i] = true且字典中包含从i到j-1的位置的字符串。这样dp[j] = true;故 if(dp[i] == true && set.contains(substring(i,j))){dp[j] = true;}

                                ④初始化:因为根据递推公式,当前值是根据前面的值得到,所以初始化dp[0] = true --- 可以这样理解,即如果容量为0,根据字典不填东西,就能填满这个背包,所以是true非0位置初始化为false,因为一开始不知道是否能拼出s,所以初始值应该为false。

                                ⑤遍历顺序:首先单词可以重复使用,所以完全背包问题,背包正序遍历。然后假如s = applepenapple,字典中有apple,pen两个元素。那么将其组合成s要求121,112就不行,所以对顺序有要求,故求排列数,故先遍历背包再遍历物品

                                ⑥最后返回dp[s.size()]

                                ⑦Note:因为我要判断字典中是否包含从i到j-1位置的字符串,所以要用到contains方法,所以要将给定的链表转成HashSet,这样就能用contains方法了。截取字符串用substring(i,j)左闭右开

                                ⑧在遍历物品的时候终止条件是i < j,因为分析递推公式的时候,i就是小于j的。同时也可以这样想,递推公式里的判断就要求i<j,否则set.contains(substring(i,j))就错误了。

        2.步骤:

                                ①创建dp数组,长度为s.size()+1

                                ②将字典转化成集合--- 即HashSet<String> set = new ArrayList<>(wordDict)

                                ③初始化:dp[0] = true;其余位置在创建数组的时候相当于自动初始化成false了。

                                ④遍历顺序:for(int j = 1;j <= s.size();j++){

                                        for(int i = 0; i < j;i++){

                                                if(dp[i] == true && set.contains(substring(i,j) ){

                                                                dp[j] = true;

                                                                                                                        }

                                                                           } 

                                                                                                            }        

                                ⑤最后返回dp[s.size()]

下面为代码(java):

                                                                       

 

2.题目链接: 多重背包

题目描述:

给定一个容量为bagSize的背包,给定一堆物品,第i个物品对应重量为weight[i],价值为value[i],物品个数为nums[i],求装满背包的最大价值为多少?

解法:

        1.五步曲:

                                ①其实看起来很像01背包问题,不同之处就是01背包每个物品只能用一次,而这里每个物品都有个数,那么将个数摊开就变成了01背包问题。

                                ②如何摊开:

                                                1)首先我们将weight,value,nums数组都转成链表格式 = new ArrayList<>(Arrays.asList(1,3,5));

                                                2)while(nums.get(i) > 1){// 即有多的weight里加一个,value里加一个,重新设置nums链表第i个位置的值

                                                        weight.add(weight.get(i));

                                                        value.add(value.get(i));

                                                        nums.set(i,nums.get(i) - 1); --- 重新设置nums链表中第i个位置的值

}

                                ③这样就变成了01背包 --- 递推公式:即dp[j] = max(dp[j] , dp[j-weight[i]] + value[i]);遍历顺序:倒序背包(保证每一个物品只用一次);先物品后背包(不然的话求的就是每个背包中装价值最大的物品)。

        2.步骤:

                        ①List<Integer> weight = new ArrayList<>(Arrays.asList(1,3,5))

                        ②再分别创建value和nums

                        ③然后将多重背包变成01背包问题,即摊开

                                for(int i = 0; i < nums.length ;i++){

                                        while(nums.get(i) > 1){

                                                weight.add(weight.get(i));

                                                value.add(value.get(i));

                                                nums.set(i, nums.get(i) - 1);//即nums中i位置的值减减

                                                                             }

}

                        ④剩下就是01背包的创建dp数组,确定递推公式,初始化,确定遍历顺序,最后返回dp[bagSize]。

下面为代码(java):

3.总结:

                ①单词拆分问题:

                                        1)dp[j]代表能否根据字典填充满长度为j的字符串。

                                        2)递推公式要根据前面的i位置的状态以及i到j-1是否能在字典中找到判断。

                                        3)遍历顺序:字典单词可用多次---完全背包;要求结果有顺序---排列数,先背包后物品。

                                        4)初始化:dp[0] = true,非0为false。

                ②多重背包问题:将其的物品个数摊开,就变成了01背包。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot 指标监控 Actuator

Spring Boot Actuator为 Micrometer 提供了依赖管理和自动配置&#xff0c;Micrometer是一个支持 众多监控系统 的应用程序指标接口 该功能与&#xff1a;java\jdk\bin 下的 Jconsole 功能雷同 1、pom文件中引入依赖&#xff08;使用的springboot是2.7.2&#xff09; <dep…

15- 决策回归树, 随机森林, 极限森林 (决策树优化) (算法)

1. 决策回归树: from sklearn.tree import DecisionTreeRegressor model DecisionTreeRegressor(criterionmse,max_depth3) model.fit(X,y) # X是40个点 y是一个圆 2. 随机森林 稳定预测: from sklearn.ensemble import RandomForestClassifier # model RandomForestC…

Flink相关的记录

Flink源码编译首次编译的时候&#xff0c;去除不必要的操作&#xff0c;同时install会把Flink中的module安装到本地仓库&#xff0c;这样依赖当前module的其他组件就无需去远程仓库拉取当前module&#xff0c;节省了时间。mvn clean install -T 4 -DskipTests -Dfast -Dmaven.c…

对比Vector、ArrayList、LinkedList有何区别?

第8讲 | 对比Vector、ArrayList、LinkedList有何区别&#xff1f; 我们在日常的工作中&#xff0c;能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同&#xff0c;比如我最早学习的 C 语言&#xff0c;需要自己实现很多基础数据结构&#xff0c;管…

SpringCloud入门实战(六)-OpenFeign服务调用

⭐️ SpringCloud 入门实战系列不迷路&#xff1a; SpringCloud 入门实战&#xff08;一&#xff09;什么是SpringCloud&#xff1f;SpringCloud 入门实战&#xff08;二&#xff09;-SpringCloud项目搭建SpringCloud 入门实战&#xff08;三&#xff09;-Eureka注册中心集成S…

基于JAVA+SpringBoot+LayUI+Shiro的仓库管理系统

基于JAVASpringBootLayUIShiro的仓库管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项…

React基础用法,脚手架创建项目。父子及兄弟通信,跨组件通信,定时器时钟案例

create React App 脚手架工具创建项目1.下载插件2.打开终端npx create-react-app my-app //my-app是自己创建的项目名创建完成后cd my-app&#xff0c;到该项目的盘符执行npm start&#xff0c;就可以运行起来了组件通讯父传子在父亲组件中引用子组件在render&#xff08;&…

基于商品理解的成交能力和成交满意度优化在Lazada的实践

作者&#xff1a;马蕊 Lazada推荐算法团队 在Lazada各域推荐场景中&#xff0c;既有优质商品优质卖家不断涌现带来的机会&#xff0c;也有商品质量参差带来的问题。如何才能为用户提供更好的体验&#xff0c;对卖家变化行为进行正向激励呢&#xff1f;下面本文将为大家分享我们…

在TheSandbox 的「BOYS PLANET」元宇宙中与你的男孩们见面吧!

世界各的男孩们成为 K-Pop 男团的旅程。 Mnet 的全球项目 BOYS PLANET 终于在 2 月 2 日首次亮相&#xff01; The Sandbox 与 CJ ENM 合作&#xff0c;于 2 月 6 日晚上 10 点开始举办两个基于 BOYS PLANET 生存节目的虚拟体验&#xff1a;BOYS PLANET&#xff1a;BOYS LAND 和…

五年制转本学历很重要江苏专转本

五年制转本学历很重要&#xff01; 大专和本科是有区别的 越好的公司&#xff0c;越重要的职位&#xff0c;要求越高。 目前在中大型企业&#xff0c;除了销售、行政等岗位&#xff0c;其他普遍要求本科学历&#xff0c;有些可以放宽到大专。很多公司对于程序员等岗位的要求不仅…

java中方法的学习笔记

java中方法是完成特定的功能的&#xff0c;相对独立的程序段&#xff0c;与其他编程语言中的子程序&#xff0c;函数等概念相当。 方法一定义&#xff0c;就可以在不同的程序段中调用&#xff0c;因此方法可以增强程序的清晰度&#xff0c;提高编码的效率 方法的声明 [修饰符…

装备制造业数字化转型CRM系统解决方案(信息图)

一、制造企业面临的机遇与挑战 2021年12月28日&#xff0c;工业和信息化部等八部门联合对外发布《“十四五”智能制造发展规划》&#xff0c;明确提到“推进智能制造&#xff0c;要立足制造本质&#xff0c;紧扣智能特征&#xff0c;以工艺、装备为核心&#xff0c;以数据为基…

jsp(全部知识点)

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…

窗口置顶工具v2.6.0(截图+贴图)

大家好&#xff0c;很高兴能再次更新版本&#xff0c;距上一年12月份到现在&#xff0c;有差不多两个月没有更新了&#xff0c;主要是年底&#xff0c;工作方面要冲刺&#xff0c;直到上周才有空继续开发置顶工具。 本来想再偷懒一段时间再开发&#xff0c;但最近在工作中经常…

用于高效高光谱图像分类的多尺度上下文感知集成深度 KELM(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 高光谱遥感&#xff0c;作为成像技术与细分光谱技术有机结合的成像光谱遥感&#xff0c;可以获取在可见光到短波红外甚至中红外…

重构之改善既有代码的设计(一)

1.1 何为重构&#xff0c;为何重构 第一个定义是名词形式&#xff1a; 重构&#xff08;名词&#xff09;&#xff1a;对软件内部结构的一种调整&#xff0c;目的是在不改变「软件可察行为」前提下&#xff0c;提高其可理解性&#xff0c;降低修改成本。 「重构」的另一个用…

Bigscreen Beyond头显解析:极致轻量化,显示部分仅127g

近年来&#xff0c;一体机占据了C端VR市场主要地位&#xff0c;其采用低成本、低门槛、无线化设计&#xff0c;对消费者足够友好。尽管如此&#xff0c;PC VR生态也在发展&#xff0c;相比于一体机&#xff0c;PC VR可提供视觉质量更高的VR体验&#xff0c;而且依托于SteamVR生…

LayUI表格渲染实现前后端交互

方法渲染 初始化 table 容器中配置好相应的参数&#xff0c;由 table 模块内部自动对其完成渲染&#xff0c;而无需你写初始的渲染方法。 首先满足&#xff1a; 带有 class"layui-table"的 标签&#xff1b;对标签设置属性lay-data"" 用于配置一些基础参…

索引-性能分析-explain

explain 执行计划 explain 执行计划各字段含义 1&#xff09;id 就是代表 sql 的执行顺序或者表的执行顺序&#xff1b;id相同从上往下执行&#xff0c;id不同&#xff0c;id值越大越先执行&#xff1b;&#xff08;注&#xff1a;有子查询时就会出现sql执行顺序&#xff09;…

【物联网】mqtt初体验

文章目录安装EMQXjava集成添加依赖mqtt配置参数发布组件订阅组件测试接口接口测试最近在了解物联网云平台方面的知识&#xff0c;解除了mqtt协议&#xff0c;只看书籍难免有些枯燥&#xff0c;所以直接试验一下&#xff0c;便于巩固理论知识。 broker服务器操作系统&#xff1a…