代码随想录算法训练营第四十天|139.单词拆分,多重背包,背包问题

news2024/12/22 19:07:17

139. 单词拆分 - 力扣(LeetCode)

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

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

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple"可以由 "apple" "pen" "apple" 拼接成。注意,你可以重复使用字典中的单词

思路:完全背包问题,单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。转换成背包问题有两个难点:①dp[i]是如何来的,②遍历顺序。

解决:动态规划五步曲

        1.确定dp[j]的含义;

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

        2.确定dp[j]递推公式;

        这里递推公式好像和之前不同,这里既没有01背包的价值,又没有完全背包的组合数量,通过dp[j]的含义我们知道,dp[i]要不就是true,要不就是false,我们要的就是true。

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

        到这里有点懵了,i是字符串长度,那j是什么,j这里其实表示当前遍历字符串中的位置。

        举个例子:s = "leet", wordDict = ["le", "et"]

        i等于1时,j就从0开始,j=0时,截取i-j就是le,发现wordDict中有“le”,所以dp[i]=true。

        3.确定dp初始化;

        没开始前,dp[i]=false,但是从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了

        4.确定遍历顺序;

        从上面分析可知,随着字符串长度i增大,依次遍历,能在wordDict中找到的单词肯定越多,结果也越有可能是true。,所以本题一定是先遍历背包,再遍历物品。

        举个例子:拿 s = "applepenapple", wordDict = ["apple", "pen"] 举例。

        "apple", "pen" 是物品,那么我们要求 物品的组合一定是 "apple" + "pen" + "apple" 才能组成 "applepenapple"。"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序

        5.举例推导dp数组。

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

代码:这里利用unordered_set判断是否在wordDict中找到单词。

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        vector<bool> dp(s.size()+1,false);
        unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
        dp[0]=true;
        for(int i=0;i<=s.size();i++){
            for(int j=0;j<i;j++){
                string word = s.substr(j, i - j); //substr(起始位置,截取的个数)
                if(wordSet.find(word) != wordSet.end()&&dp[j]){//dp[j]表示前j个长度的字符串可以由单词拼接,并且截取的子字符串在数组中
                    dp[i]=true;
                }
            }
        }
        return dp[s.size()];
    }
};

多重背包

        例题:有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。

        区别:多重背包和01背包是非常像的,每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。

        面试基本不会考,了解即可。

背包问题总结

难点:递推公式和遍历顺序

步骤:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

递推公式总结

        1.问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])

        2. 问装满背包有几种方法:dp[j] += dp[j - nums[i]] 

        3.问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

        4.问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j])

遍历顺序总结:

        1.01背包

        ①二维数组:二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。

        ②一维数组:一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历

        2.完全背包

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

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

总结:对于背包问题,其实递推公式算是容易的,难是难在遍历顺序上,如果把遍历顺序搞透,才算是真正理解了

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

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

相关文章

ES6原生音乐播放器(有接口)

视频展示 ES6音乐播放器 项目介绍 GutHub地址&#xff1a;GitHub - baozixiangqianchong/ES6_MusicPlayer: 音乐播放器 ES6_MusicPlayer 是基于JavaScriptES6Ajax等通过原生构建的项目。能够充分锻炼JS能力。 本项目有主页、详情页、歌单页面三部分组成 ├── assets&…

【Hive】启动beeline连接hive

1、解决报错2、在datagrip上连接hive 1、解决报错 刚开始一直报错&#xff1a;启动不起来 hive-site.xml需要配置hiveserver2相关的 在hive-site.xml文件中添加如下配置信息 <!-- 指定hiveserver2连接的host --> <property><name>hive.server2.thrift.bin…

力扣思维题/经典面试题——下一个排序

https://leetcode.cn/problems/next-permutation/description/ 字节面试题&#xff0c;非常经典的逻辑思维题 1、找到第一个下降点&#xff0c;说明这个点可以变得稍微大一点以至于让整个排列变得更加大 为什么&#xff0c;仔细想想&#xff0c;后面都是倒序了怎么都不可能变得…

fijkplayer flutter 直播流播放

fijkplayer flutter 直播流播放 fijkplayer 是 ijkplayer 的 Flutter 封装&#xff0c; 是一款支持 android 和 iOS 的 Flutter 媒体播放器插件&#xff0c; 由 ijkplayer 底层驱动。 通过纹理&#xff08;Texture&#xff09;接入播放器视频渲染到 Flutter 中。 前言 目前使用…

class072 最长递增子序列问题与扩展【算法】

class072 最长递增子序列问题与扩展【算法】 code1 300. 最长递增子序列 // 最长递增子序列和最长不下降子序列 // 给定一个整数数组nums // 找到其中最长严格递增子序列长度、最长不下降子序列长度 // 测试链接 : https://leetcode.cn/problems/longest-increasing-subsequen…

Java 简易版 UDP 多人聊天室

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

分集水器在中央空调系统中的应用,工作原理压力选型参数尺寸

​ 1&#xff1a;中央空调分集水器设备介绍 分集水器是由分水器和集水器组合而成的水流量分配和会集装置。分水器是将一路进水通过一个容器分为几路输出的设备&#xff0c;而集水器则是将多路进水通过一个容器一路输出的设备。其管理若干的支路管道&#xff0c;分别包括回水支路…

1-1、Java概述

语雀原文链接 文章目录 1、Java发展2、Java体系结构3、Java特点 1、Java发展 1990年&#xff0c;Sun公司(Stanford University Network,斯坦福大学网络公司)詹姆斯高斯林推出的一门语言最开始注册的名字oak语言(橡树)&#xff0c;重名了被迫改成Java2009年Sun公司被甲骨文Ora…

IP地址定位技术为网络安全建设提供全新方案

随着互联网的普及和数字化进程的加速&#xff0c;网络安全问题日益引人关注。网络攻击、数据泄露、欺诈行为等安全威胁层出不穷&#xff0c;对个人隐私、企业机密和社会稳定构成严重威胁。在这样的背景下&#xff0c;IP地址定位技术应运而生&#xff0c;为网络安全建设提供了一…

向日葵远程控制鼠标异常的问题

​ 在通过向日葵进行远程控制的时候&#xff0c;可能会遇到鼠标位置异常的问题。此时&#xff0c;不管怎么移动鼠标&#xff0c;都会停留在屏幕最上方&#xff0c;而无法点击到正确的位置。如图&#xff1a; 此时&#xff0c;如果启用了“被控端鼠标”功能&#xff0c;可以正…

代码随想录二刷 |二叉树 |二叉树的最大深度

代码随想录二刷 &#xff5c;二叉树 &#xff5c;二叉树的最大深度 题目描述解题思路代码实现 题目描述 104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a;…

键盘打字盲打练习系列之矫正坐姿——4

一.欢迎来到我的酒馆 盲打&#xff0c;矫正坐姿&#xff01; 目录 一.欢迎来到我的酒馆二.继续练习二.矫正坐姿1.键盘鼠标选购指南2.椅子选购指南 三.改善坐姿建议 二.继续练习 前面的章节&#xff0c;我们重点向大家介绍了主键盘区指法和键盘键位。经过一个系列的教程学习&am…

table中cellspacing、cellpadding的css替代写法

table中cellspacing、cellpadding的css替代写法 table{border:0;margin:0;border-collapse:collapse;border-spacing:0;} /*控制cellspacing*/ table td{padding:0;} /*控制cellpadding*/

用chatGPT开发项目:我想的无人的智慧树网站 流量之神 利用人工智能的算法将人吸引住 GPT4是不是越来越难用了,问一下就要证明一下自己是不是人类

广度发散&#xff1a;让AI给出时代或今日或你关注的热点事件 比如采集新闻头条&#xff0c;根据内容或标题&#xff0c;以不同的角度&#xff0c;或各种人群的角色&#xff0c;生成50篇简短的文章。一下就能占传统的搜索引擎。这是AI最擅长的【千人千面&#xff0c;海量生成】…

C语言中实参和形参的值传递,一直都不理解

C语言中实参和形参的值传递&#xff0c;一直都不理解 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C语言从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01…

Unity 实现单例模式

目录 基本概念 饿汉模式(推荐) 懒汉模式&#xff1a; 基本概念 单例模式&#xff1a;类只有一个实例&#xff0c;一般使用static来实现单例模式&#xff1b; 比如&#xff1a;有一个Test类,实现了单例&#xff0c;假设这个唯一的实例名为SingTonle,实例在类内被实现并被stat…

Flask和Vue框架实现WebSocket消息通信

1 安装环境 1.1 安装Flask环境 主要的安装包 Flask、Flask-SocketIO&#xff0c;注意Python版本要求3.6 # Flask-SocketIO参考地址 https://flask-socketio.readthedocs.io/en/latest/ https://github.com/miguelgrinberg/flask-socketio更新基础环境 # 更新pip python -m …

软考高级备考-系统架构师(机考后新版教材的备考过程与资料分享)

软考高级-系统架构设计师 考试复盘1.考试结果2.备考计划3.个人心得 资料分享 考试复盘 1.考试结果 三科压线过&#xff0c;真是太太太太太太太幸运了。上天对我如此眷顾&#xff0c;那不得不分享下我的备考过程以及一些备考资料&#xff0c;帮助更多小伙伴通过考试。 2.备考…

HarmonyOS4.0从零开始的开发教程10Video组件的使用

HarmonyOS&#xff08;九&#xff09;Video组件的使用 概述 在手机、平板或是智慧屏这些终端设备上&#xff0c;媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集&#xff0c;还是视频的播放、切换、循环&#xff0c;亦或是相机的预览、拍照等功能…

jQuery中点击按钮发送多次请求

jQuery中点击按钮发送多次请求 /* 采用以下常规触发按钮去执行回调函数&#xff0c;可能会发送多次请求。并且会影响到数据库表 原因分析&#xff1a;可能是前端原型&#xff0c;绑定了多次事件。 */ $("#saveBtn").click(function (){$.ajax({}) }/* 解决办法如下&a…