代码随想录 Day39 动态规划 LeetCode T139 单词拆分 动规总结篇1

news2024/12/22 21:00:33

前言

在本期开始之前,让我们再回顾一下动规五部曲,并且今天的任务只有一道题,我们顺便也回顾一下之前学过的知识点,动规的前面集中化题型,0-1背包,完全背包,以及很多种遍历顺序,让秋秋和大家娓娓道来.

首先我们回顾一下动态规划的动规五部曲.

1.明确dp数组的元素含义

2.明确dp数组的递推公式

3.初始化dp数组

4.明确dp数组的遍历方式

5.打印dp数组排错逻辑

前面文章回顾:

代码随想录Day32 动态规划01 LeetCodeT509 斐波那契数列 T70 爬楼梯 T746 爬楼梯的最小消耗-CSDN博客

代码随想录Day33 LeetCode T62不同路径 LeetCode T63 不同路径II-CSDN博客

代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树-CSDN博客

代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集-CSDN博客

代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零-CSDN博客

代码随想录 Day37 完全背包理论基础 卡码网T52 LeetCode T518 零钱兑换II T377 组合总和IV-CSDN博客

代码随想录 Day38 完全背包问题 LeetCode T70 爬楼梯 T322 零钱兑换 T279 完全平方数-CSDN博客

LeetCode T139 单词划分

题目链接:139. 单词拆分 - 力扣(LeetCode)

题目思路:

本题最简单的思路肯定是回溯算法去暴力枚举每一种结果,我们可以回顾一下之前的回溯算法

算法的复杂度是O(2^n),因为每一个元素只有两种结果,选或者不选,当然这道题不是我们今天的主菜,下面我会给出可以ac的回溯算法的代码,但是今天我们还是着重讨论动规算法的解法

1.明确dp数组的元素含义

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

2.明确dp数组的递推公式

递推公式就是当[j,i]这个字符串出现在字典里,并且dp[j]是true,那么就设置为dp[i]为true

3.初始化dp数组

dp[0] = true;其他的赋值为false

4.明确dp数组的遍历方式

先遍历背包后遍历物品,理由在拓展中,用用例举例,假如第一个apple写入了一个true,第二个元素pen并不能将最后一个元素赋值为true,除非再给一个apple来遍历才行

5.打印dp数组排错逻辑

题目代码:

//动规算法的解法
class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
       boolean[] dp = new boolean[s.length()+1];
       //初始化
       Arrays.fill(dp,false);
       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] == true && word.equals(s.substring(i-len,i)) ){
                   dp[i] = true;
               }
           }
       }
       return dp[s.length()];
        

    }
}






//回溯算法的解法

class Solution {
    private Set<String> set;
    private int[] memo;
    public boolean wordBreak(String s, List<String> wordDict) {
        memo = new int[s.length()];
        set = new HashSet<>(wordDict);
        return backtracking(s, 0);
    }

    public boolean backtracking(String s, int startIndex) {
        // System.out.println(startIndex);
        if (startIndex == s.length()) {
            return true;
        }
        if (memo[startIndex] == -1) {
            return false;
        }

        for (int i = startIndex; i < s.length(); i++) {
            String sub = s.substring(startIndex, i + 1);
	    // 拆分出来的单词无法匹配
            if (!set.contains(sub)) {
                continue;                
            }
            boolean res = backtracking(s, i + 1);
            if (res) return true;
        }
        // 这里是关键,找遍了startIndex~s.length()也没能完全匹配,标记从startIndex开始不能找到
        memo[startIndex] = -1;
        return false;
    }
}

拓展:

 这里我们也谈一下为什么不能先遍历物品,后遍历背包不行?

因为这里我们先想一想之前遍历背包再遍历物品先遍历物品在再遍历背包 分别对应了什么问题的解决

先物品后背包    ---------------      组合问题,不讲究顺序

先背包后数组    ---------------      排列问题,讲究顺序

使用用例:s = "applepenapple", wordDict = ["apple", "pen"],对应的dp数组状态如下:

最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 "apple" 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。

除非是先用 "apple" 遍历一遍,再用 "pen" 遍历,此时 dp[8]已经是1,最后再用 "apple" 去遍历,dp[13]才能是1。

总结动规问题1

普通动规问题

斐波那契数   

递推公式:dp[i] = dp[i-1]+dp[i-2];

爬楼梯

递推公式:dp[i] = dp[i-1]+dp[i-2];

最小花费爬楼梯

这里比上面多了一个价值和求最小值

dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);

不同路径

dp[i][j] = dp[i-1][j] + dp[i][j-1]; 结果从左边和上面产生

不同路径II(加上阻碍)

dp[i][j] = (obstacleGrid[i][j] == 0)?dp[i-1][j] + dp[i][j-1]:0;遇到阻碍标记成0

整数拆分

dp[i] = Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j])) 拆分成两个或多个

不同的搜索二叉树

这时候dp[i]表示j个节点有多少个不同的二叉搜索树

dp[i] += dp[j-1] * dp[i-j];

注:左子树节点数*右子树

0-1背包(一维数组遍历背包是从大到小,避免每个物品取了多次)

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

重要的公式说三遍

分割等和子集

求和除以2当做背包容量

查看能否装满

dp[j]表示放进物品时,最大容量

dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);

最后一块石头的重量II

和上面一样分两半处理,最后用sum减去中间值dp的两倍即可

dp[j] = Math.max(dp[j],dp[j-stones[i]]+stones[j])

目标和(此时就在原来的基础上变成了方法有多少种)

求正1的数量和-1的都可以,通过推导得到公式

left = (target+sum)/2   正的阵营

dp += dp[j-nums[i]]

一和零

用一维数组从两个维度思考问题,价值是有x和y两个维度

和前面一样倒序遍历不过从两个维度出发

for (int i = m; i >= zeroNum; i--) {
                for (int j = n; j >= oneNum; j--) {
                    dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
                }
            }

完全背包(在0-1背包上遍历背包改成从前向后)

零钱兑换II

求组合数

求方法数dp[j]+=dp[j-coins[i]];

组合总和IV

求排列数,先背包后物品

爬楼梯(进阶)

累加即可,排列数

零钱兑换

由于求最小值,所以赋值为最大数,如果dp[j-coins[i]]没变就代表这个数没意义

dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);

完全平方数

最小的装满同上思路,不过这题不是隔着修改,无需判断是否有效

单词拆分

这题一定要用背包遍历物品,原因在上面

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

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

相关文章

技术分享 | app自动化测试(Android)--触屏操作自动化

导入TouchAction Python 版本 from appium.webdriver.common.touch_action import TouchAction Java 版本 import io.appium.java_client.TouchAction; 常用的手势操作 press 按下 TouchAction 提供的常用的手势操作有如下操作&#xff1a; press 按下 release 释放 …

Python高级进阶(1)----深入理解Python迭代器与生成器

文章目录 1. 迭代器协议代码示例:2. 生成器基础代码示例:3. 使用yield的高级技巧代码示例:4. 生成器表达式代码示例:迭代器和生成器是Python中实现迭代的两种主要方式,它们都允许用户创建可以遍历数据集的对象。在Python中,迭代器协议是指对象需要遵守__iter__()和__next…

05【保姆级】-GO语言的标识符

之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&#xff0c;然后know why。先做出来&#xff0c;然后再去一点点研究&#xff0c;才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

Java开发注意事项和细节说明

&#x1f468;‍&#x1f393;&#x1f468;‍&#x1f393;博主&#xff1a;发量不足 个人简介&#xff1a;耐心&#xff0c;自信来源于你强大的思想和知识基础&#xff01;&#xff01; &#x1f4d1;&#x1f4d1;本期更新内容&#xff1a;Java开发注意事项和细节说明&…

项目部署之安装和配置Canal

1.Canal介绍 Canal是阿里巴巴的一个开源项目&#xff0c;基于java实现&#xff0c;整体已经在很多大型的互联网项目生产环境中使用&#xff0c;包括阿里、美团等都有广泛的应用&#xff0c;是一个非常成熟的数据库同步方案&#xff0c;基础的使用只需要进行简单的配置即可。 …

HelpLook VS HelpDocs:知识库工具一对一比较

您是否正在寻找比HelpDocs更好的替代方案&#xff1f;您是否希望使用功能更强大的类似工具&#xff1f;HelpDocs是一款简单易用的知识库软件&#xff0c;可以在一个集中的位置创建、托管和监控自助服务门户。凭借其模板、原生集成和详细的分析功能提供不错的用户体验。尽管它具…

我在Vscode学OpenCV 图像运算(权重、逻辑运算、掩码、位分解、数字水印)

文章目录 权重 _ 要求两幅图像是相同大小的。[ 1 ] 以数据说话&#xff08; 1&#xff09; 最终&#xff1a;&#xff08; 2 &#xff09;gamma _输出图像的标量值 [ 2 ] 图像的展现力gamma并不等同于增加曝光度&#xff08; 1 &#xff09;gamma100&#xff08; 2 &#xff09…

武器检测YOLOV8NANO

武器检测&#xff08;匕首&#xff0c;步枪&#xff0c;手枪&#xff09;&#xff0c;采用YOLOV8NANO训练&#xff0c;得到pt模型&#xff0c;然后转换成Onnx模型&#xff0c;供OPENCV DNN调用&#xff0c;支持C,PYTHON,ANDROID。有标注的训练集 武器检测YOLOV8NANO

04-react基础知识-路由

一、react路由环境安装 使用指令&#xff1a;npm i --save react-router-dom type/react-router-dom进行react路由环境安装 二、引入路由 在main.jsx文件中引入该语句&#xff1a; import { createBrowserRouter, RouterProvider } from react-router-dom 定义一个变量rou…

Socket 通信

文章目录 Socket 通信创建流程图通信示例对一些概念进行讲述对Socke 编程所用的函数进行讲解 网络通信 和 Socket Socket 通信流程图 &#xff1a; 通信示例 对Socket 编程有一个初步的了解, 看看具体代码是如何实现的. 示例的主要功能: 实现大小写的转化,客户端发送数据 …

传输线的阻抗和反射到底是什么关系?

传输线的阻抗和反射到底是什么关系? 传输线是通信系统中最基本的传输元件之一&#xff0c;它可以将信号从一个端点传输到另一个端点。然而&#xff0c;在实际的通信系统中&#xff0c;传输线往往面临着许多问题&#xff0c;其中最主要的两个问题是阻抗不匹配和信号反射。本文将…

zabbix监控安装-linux

zabbix6.4中文文档1. 简介 (zabbix.com) Zabbix 是一个企业级的开源分布式监控解决方案。 1.zabbix结构体系 Server&#xff1a; server 是存储所有配置、统计和操作数据的中央存储库。 Proxy&#xff1a; zabbix proxy可以代替 Zabbix server 收集性能和可用性数据。p…

linux的美化工具 oh-my-zsh的安装与使用 神器工具

目录 1 安装zsh的环境2 安装 Oh My Zsh3 主题设置重新启动终端:关闭连接 在重新链接一下附加 -插件管理案例讲解看效果 Oh My Zsh 是一款基于 Zsh 的开源命令行工具&#xff0c;它提供了丰富的主题和插件&#xff0c;可以帮助用户更加高效地使用终端。本文将详细介绍 Oh My Zsh…

【StringBuilder和StringBuffer】

文章目录 StringBuilder和StringBufferString类、StringBuilder和StringBuffer的区别 StringBuilder和StringBuffer的区别StringBuilder 字符串逆置 StringBuilder和StringBuffer String类、StringBuilder和StringBuffer的区别 String类的特点是不可变性&#xff0c;所以Stri…

Android项目升级到AndroidX

1、 2、 然后报错了&#xff1a; The gradle plugin version in your project build.gradle file needs to be set to at least com.android.tools.build:gradle:3.2.0 in order to migrate to AndroidX. 修改gradle版本 31报错了就用30.0.0了 3、 提示备份、然后执行do re…

软文发布如何选择对应的媒体

企业做软文推广第一步&#xff0c;就是选择合适的媒体进行投放&#xff0c;然而许多企业不知道如何选择合适的媒体导致推广工作十分被动&#xff0c;无法取得效果&#xff0c;今天媒介盒子就来和大家分享&#xff0c;企业应该如何选择对应的媒体。 一、 媒体类型 根据软文类型…

视频集中存储EasyCVR平台播放一段时间后出现黑屏是什么原因?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

有关环境变量

什么是环境变量 用户变量仅对当前用户有效&#xff0c;系统变量对整个系统有效 环境变量就是一个字符串&#xff0c;为了方便修改给隔开了&#xff08;图形化界面&#xff09; 环境变量可以用来配置路径&#xff0c;也可以用来配置其他&#xff0c;比如图中的 NUMBER_OF_PROC…

医院陪诊小程序源码 医院陪诊陪护系统源码

医院陪诊小程序源码 医院陪诊陪护系统源码 陪诊系统小程序&#xff1a;提高陪诊效率&#xff0c;改善医疗服务体验 近年来&#xff0c;随着互联网技术的不断发展&#xff0c;我们的生活中出现了越来越多的智能设备和智能应用&#xff0c;这些智能应用不仅极大方便了我们的生活…

数据仓库工具箱-零售业务

文章目录 一、维度模型设计的4步过程1.1 第一步&#xff1a;选择业务过程1.2 第二步&#xff1a;声明粒度1.3 第三步&#xff1a;确定维度1.4 第四步&#xff1a;确定事实 二、零售业务案例研究2.1 第一步&#xff1a;选择业务过程2.2 第二步&#xff1a;声明粒度2.3 第三步&am…