Day40:139.单词拆分、背包问题总结

文章目录

    • 139.单词拆分
      • 思路
      • 代码实现
    • 背包问题总结
      • 背包类型
      • 递推公式


139.单词拆分

题目链接

思路

  1. 确定dp数组以及下标的含义
    dp[i] : 从0开始长度为i的字符串是否可以拆分为一个或多个在字典中出现的单词
  2. 确定递推公式
    如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。
    递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true)
  3. dp数组如何初始化
    dp[0]一定要为true,否则递推下去后面都都是false了。下标非0的dp[i]初始化为false
  4. 确定遍历顺序
    本题其实我们求的是排列数。
    拿 s = “applepenapple”, wordDict = [“apple”, “pen”] 举例:
    “apple”, “pen” 是物品,那么我们要求 物品的组合一定是 “apple” + “pen” + “apple” 才能组成 “applepenapple”。
    “apple” + “apple” + “pen” 或者 “pen” + “apple” + “apple” 是不可以的,那么我们就是强调物品之间顺序。
    所以说,本题一定是先遍历背包,再遍历物品。
  5. 举例推导dp[i]

代码实现

有一个困惑点,为什么不能用wordSet.size()而必须用s.size()

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
        vector<bool> dp(s.size() + 1, false);
        dp[0] = true;
        for (int i = 1; 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[i] = true;
                }
            }
        }
        return dp[s.size()];
    }
};

背包问题总结

背包类型

  1. 01背包
    有限个种类数的物品,每个只有一个,装在有限个单一背包里
    一维数组基本上都是外层背包内层物品,外层循环从前到后遍历,内层循环从后向前遍历,以防重复计算
    对应题目:
    等和分割子串
    最后一块石头的重量 II
    目标和
    一和零:这道题是二维的问题,有点抽象
  2. 完全背包
    有限个种类数的物品,每个有无数个,装在有限个单一背包里
    组合问题一般外层循环是物品,遍历顺序从前到后;内层循环是背包,遍历顺序从前到后
    排列问题一般外层循环是背包,遍历顺序从前到后;内层循环是物品,遍历顺序从前到后
    对应题目:
    组合问题:零钱兑换II
    排列问题:组合总和 Ⅳ、爬楼梯、零钱兑换、完全平方数、⭐️单词拆分:这道题看不太出可以用动态规划,但是把字符串长度看成背包,字符串内单词看成物品,也可以用动态规划方法来解决,因为我们最后想得到的结果只是一个bool值,内部单词顺序不同对答案有影响,所以是个排列问题
  3. 多重背包
    有限个种类数的物品,每个有多个,装在有限个单一背包里
    其实把它转化为01背包就好了。
    如下图的要求:
    在这里插入图片描述
    转化为01背包则为:
    在这里插入图片描述

递推公式

问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);,对应题目如下:
等和分割子串
最后一块石头的重量 II
问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:
零钱兑换II
目标和
组合总和 Ⅳ
爬楼梯
问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); ,对应题目如下:
一和零
问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]); ,对应题目如下:
零钱兑换
完全平方数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webpack loader

1、分类 2、执行顺序 配置类型 执行顺序是 loader1>loader2>loader3 3、使用方式 自己的第一个loader 同步loader /*** loader 就是一个函数* 当webpack 解释资源时&#xff0c; 会调用相应的loader去处理* loader 接收到文件内容作为参数&#xff0c;返回文件内容* p…

【AGC】鸿蒙应用软件包上传问题解析

【问题背景】 近期收到了一些反馈&#xff0c;一些鸿蒙元服务开发者在发布应用市场的过程中&#xff0c;上传.app包时遇到了不同的报错&#xff0c;导致上传失败&#xff0c;下面来看一下这些报错的具体原因&#xff0c;如何正确打包上传。 【问题描述1】 HarmonyOS元服务软件…

刚刚!OpenAI官宣!Sam Altman回归OpenAI 担任CEO

大家好我是二狗&#xff0c;就在刚刚&#xff01; OpenAI宣布&#xff0c;Sam Altman将重新回到 OpenAI 担任CEO。 并组建由Bret Taylor&#xff08;主席&#xff09;、Larry Summers 和 Adam DAngelo 组成的新的初始董事会。 Sam Altman第一时间做了石锤回应&#xff1a; Sa…

上海亚商投顾:北证50指数持续大涨 短剧概念股再爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指跌超1.4%&#xff0c;创业板指跌超1.7%。北证50指数大涨超8%&#xff0c;…

Day37力扣打卡

打卡记录 美化数组的最少删除数&#xff08;贪心&#xff09; 链接 class Solution:def minDeletion(self, nums: List[int]) -> int:n, cnt len(nums), 0for i in range(n):if (i - cnt) % 2 0 and i 1 < n and nums[i] nums[i 1]:cnt 1return cnt 1 if (n - c…

红黑树java实现

红黑树的性质 红黑树是一课二叉搜索树&#xff0c;它在每个结点上增加了一个存储位来表示结点的颜色&#xff0c;可以使RED或BLACK。通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束&#xff0c;红黑树确保没有一条路径会比其他路径长出2倍&#xff0c;因而是近似…

ChatGPT规模化服务的经验与教训

2022年11月30日&#xff0c;OpenAI发布ChatGPT&#xff0c;以很多人未曾预料的速度迅速走红。与此同时&#xff0c;由于短时间内用户量的暴涨&#xff0c;导致服务器过载&#xff0c;迫使OpenAI停止新用户的注册。 ChatGPT发布这一年&#xff0c;同样的情景发生了好几次。在最近…

RT-Thread 线程间同步【信号量、互斥量、事件集】

线程间同步 一、信号量1. 创建信号量2. 获取信号量3. 释放信号量4. 删除信号量5. 代码示例 二、互斥量1. 创建互斥量2. 获取互斥量3. 释放互斥量4. 删除互斥量5. 代码示例 三、事件集1. 创建事件集2. 发送事件3. 接收事件4. 删除事件集5. 代码示例 简单来说&#xff0c;同步就是…

基于PCA算法的点云平面拟合

平面拟合 1、平面拟合2、参考文献3、相关代码 1、平面拟合 PCA 是一种数学变换的方法&#xff0c;利用降维的思想在变换中保持变量的总方差不变&#xff0c;将给定的一组变量线性变换为另一组不相关的变量&#xff0c;并且使变换后的第一变量的方差最大&#xff0c;即第一主成分…

2023亚太杯数学建模赛题人工精准翻译

大家好&#xff0c;亚太杯今天早上6点已经开赛啦&#xff0c;然后我在这里给大家带来赛题的精准人工翻译&#xff0c;防止大家直接用软件翻译导致某些地方乱码或者翻译不精准&#xff0c;这会导致后续做题过程出现很大偏差。 注意&#xff0c;以下翻译均免费发放word形式的哈&…

使用websocket获取thingsboard设备的实时数据

背景 有一个读者前来咨询,如何实时获取设备的遥测数据。 其实tb是有提供websocket接口来获取设备数据的。而且还支持js跨域调用。下面给大家演示一下。 websocket地址 完整代码 <!DOCTYPE HTML> <html><h

ImportError: cannot import name ‘contextfilter‘ from ‘jinja2‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

redis的主从复制,哨兵模式

1.主从复制 主从复制&#xff1a;主从复制是redis实现高可用的基础&#xff0c;哨兵模式和集群都是在主从复制的基础之上实现高可用 主从复制实现数据的多机备份&#xff0c;以及读写分离&#xff08;主服务器负责写&#xff0c;从服务器只能读&#xff09; 缺陷&#xff1a…

让SOME/IP运转起来——SOME/IP系统设计(下)之数据库开发

上一篇我们介绍了SOME/IP矩阵的设计流程&#xff0c;这一篇重点介绍如何把SOME/IP矩阵顺利的交给下游软件团队进行开发。 车载以太网通信矩阵开发完成后&#xff0c;下一步应该做什么&#xff1f; 当我们完成SOME/IP矩阵开发&#xff0c;下一步需要把开发完成的矩阵换成固定格…

10.docker的网络network-概述

1.docker的网络模式 docker共有四种网路模式&#xff0c;分别是bridge、host、none和container. 1.1 bridge bridge,也称为虚拟网桥。在bridge模式下&#xff0c;为每个容器分配、配置IP等&#xff0c;并将容器连接到一个docker0。使用–network bridge命令指定&#xff0c;…

【每日OJ —— 622. 设计循环队列】

每日OJ —— 622. 设计循环队列 1.题目&#xff1a;622. 设计循环队列2.解法2.1.解法讲解2.1.1.算法讲解2.1.2.代码实现2.1.3.提交通过展示 1.题目&#xff1a;622. 设计循环队列 2.解法 1.本题有很多解法&#xff1a;可以使用数组&#xff0c;单链表&#xff0c;双链表&#x…

控制论与科学方法论

《控制论与科学方法论》&#xff0c;真心推荐。 书籍原文电子版PDF&#xff1a;https://pan.quark.cn/s/aa40d59295df&#xff08;分类在学习目录下&#xff09; 备用链接&#xff1a;https://pan.xunlei.com/s/VNgj2vjW-Hf_543R2K8kbaifA1?pwd2sap# 控制论是一种让系统按照我…

【精选】CSS入门必看知识点大合集

CSS简介 CSS概念 CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表&#xff0c;又叫级联样式表&#xff0c;简称样式表 CSS文件后缀名为.css CSS用于HTML文档中元素样式的定义 为什么需要CSS 使用css的唯一目的就是让网页具有美观一致的页面 语法 CSS 规则…

每日一题(LeetCode)----链表--分隔链表

每日一题(LeetCode)----链表–分隔链表 1.题目&#xff08;86. 分隔链表&#xff09; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初…

Vue3使用dataV报错问题解决

DataV官网&#xff1a;https://datav-vue3.jiaminghi.com/guide/ vue2中是没有问题的&#xff0c;这是第一次在vue3中使用发现的报错问题 报错问题 首先安装&#xff1a; pnpm add dataview/datav-vue3 1. 全局注册报错 然后main.ts全局注册 import { createApp } f…