【动态规划】392. 判断子序列、115. 不同的子序列

news2024/12/27 0:16:27

提示:努力生活,开心、快乐的一天

文章目录

  • 392. 判断子序列
    • 💡解题思路
    • 🤔遇到的问题
    • 💻代码实现
    • 🎯题目总结
  • 115. 不同的子序列
    • 💡解题思路
    • 🤔遇到的问题
    • 💻代码实现
    • 🎯题目总结
  • 🎈今日心得


392. 判断子序列

题目链接:392. 判断子序列

💡解题思路

  1. 该题与1143.最长公共子序列基本一致,不同点主要有2个
    • 本题如果删元素一定是字符串t,而 1143.最长公共子序列 是两个字符串都可以删元素。这就导致在确定递推公式的时候,针对(s[i - 1] != t[j - 1])情况,两道题的公式不一样
    • 最终返回结果,该题需要返回的是dp[s.length][t.length](最长公公子序列的长度)与s.length是否相等
  2. 动规五部曲
  • 确定dp数组以及下标的含义:dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]
  • 确定递推公式:主要就是两大情况: s[i - 1] 与 t[j - 1]相同,s[i - 1] 与 t[j - 1]不相同
    如果s[i - 1] == t[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;
    如果s[i - 1] 与 t[j - 1]不相同,此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];
    和 1143.最长公共子序列 (opens new window)的递推公式基本那就是一样的,区别就是 本题 如果删元素一定是字符串t,而 1143.最长公共子序列 是两个字符串都可以删元素
  • dp数组如何初始化:dp[i][0] = 0;dp[0][j] = 0
  • 确定遍历顺序:从递推公式,可以看出,有三个方向可以推出dp[i][j]在这里插入图片描述
  • 举例推导dp数组:按照递推公式推导一下做推导,如果发现结果不对,就把dp数组打印出来在这里插入图片描述

🤔遇到的问题

  1. 最后的返回结果,是dp[s.length][t.length](最长公公子序列的长度)与s.length是否相等

💻代码实现

动态规划

var isSubsequence = function (s, t) {
    let dp = new Array(s.length + 1).fill(0).map(x => new Array(t.length + 1).fill(0))
    for (let i = 1; i <= s.length; i++) {
        for (let j = 1; j <= t.length; j++) {
            if (s[i - 1] === t[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1
            } else {
                dp[i][j] = dp[i][j - 1]
            }
        }
    }
    return dp[s.length][t.length] === s.length ? true : false
};

🎯题目总结

dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度,所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。


115. 不同的子序列

题目链接:115. 不同的子序列

💡解题思路

  1. 动规五部曲
  • 确定dp数组以及下标的含义:dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]
  • 确定递推公式:主要就是两大情况: s[i - 1] 与 [j - 1]相同,s[i - 1] 与 t[j - 1]不相同
    如果s[i - 1] 与 t[j - 1]相同,dp[i][j]可以有两部分组成:
    一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1];一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
    如果s[i - 1] 与 t[j - 1]不相同,dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j]
  • dp数组如何初始化:
    dp[i][0] = 1;dp[i][0] 表示:以i-1为结尾的s可以随便删除元素,出现空字符串的个数,以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1
    dp[0][j] = 0;dp[0][j]表示:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数,那么dp[0][j]一定都是0,s如论如何也变成不了t
    特殊位置:dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t
  • 确定遍历顺序:从递推公式,可以看出,有三个方向可以推出dp[i][j]在这里插入图片描述
  • 举例推导dp数组:按照递推公式推导一下做推导,如果发现结果不对,就把dp数组打印出来在这里插入图片描述

🤔遇到的问题

  1. 因为dp[i][j]的含义,所以在遍历s和t的时候,都可以等于s.length或者t.length

💻代码实现

动态规划

var numDistinct = function (s, t) {
    //s:父
    //t:子
    let dp = new Array(s.length + 1).fill(0).map(x => new Array(t.length + 1).fill(0))
    //t为空字符串时
    for (let i = 0; i <= s.length; i++) {
        dp[i][0] = 1
    }
    for (let i = 1; i <= s.length; i++) {
        for (let j = 1; j <= t.length; j++) {
            if (s[i - 1] === t[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
            } else {
                dp[i][j] = dp[i - 1][j]
            }
        }
    }
    console.log(dp)
    return dp[s.length][t.length]
};

🎯题目总结

重点需要关注的是:当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。
一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]。
一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。

🎈今日心得

编辑距离的题目感觉代码很简单,但是思路确实比较难,也不容易想到

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

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

相关文章

进程地址空间初识

进程地址空间&#xff1a; 空间布局图&#xff1a; 下面来看这样一段代码&#xff1a; 对应执行的结果如下&#xff1a; 可以看到一个很奇怪的现象&#xff1a; g_val的值不同&#xff0c;却用的是同一块地址 这是为什么&#xff1f; 说明对应的地址一定不是物理地址&#…

EF执行迁移时提示provider: SSL Provider, error: 0 - 证书链是由不受信任的颁发机构颁发的

ef在执行时提示provider: SSL Provider, error: 0 - 证书链是由不受信任的颁发机构颁发的。 只需要在数据库链接字符串后增加EncryptTrue;TrustServerCertificateTrue;即可 再次执行

c++生成随机数(猜数字游戏)

如果之前学过python的小伙伴看到随机数这个知识点肯定会觉得很简单&#xff0c;但是c的随机数就需要注意一些小细节了~ 先来给大家展示一下python的随机数&#xff1a; import random #导入随机数库 arandom.randint(100,200)#随机100-200之间的数字 以下是c的&a…

【黑夜送书第一期】好书来袭,AI时代程序员/项目经理开发之道送3本~

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

Elasticsearch:生成式人工智能带来的社会转变

作者&#xff1a;JEFF VESTAL 了解 Elastic 如何走在大型语言模型革命的最前沿 – 通过提供实时信息并将 LLM 集成到数据分析的搜索、可观察性和安全系统中&#xff0c;帮助用户将 LLM 提升到新的高度。 iPhone 社会转变&#xff1a;新时代的黎明 曾几何时&#xff0c;不久前…

毫米波雷达2-雷达的工作模式

文章目录 flash mode: 用于烧写functional mode: Power off the board and remove the jumper from only header SOP2 (this puts the board back in functional mode) flash mode: 用于烧写 functional mode: Power off the board and remove the jumper from only header SOP…

配电房环境智能监控系统:守护电力设施,保障安全运行

随着电力系统的日益复杂化&#xff0c;配电房的环境监控显得尤为重要。传统的监控方式已经无法满足现代配电房的需求&#xff0c;因此&#xff0c;配电房环境智能监控系统应运而生。 一、系统概述 力安科技电易云配电房环境智能监控系统是一款集成了环境参数监测、设备运行…

当AI遇上3D建模:一场创意与技术的完美碰撞!

在这个充满无限可能的时代&#xff0c;科技的发展日新月异&#xff0c;让我们见证了一场创意与技术的完美碰撞——AI与3D建模的结合。这种结合为我们开辟了一个全新的领域&#xff0c;让我们在虚拟世界中自由挥洒创意&#xff0c;为现实世界创造更多的可能性。 3D建模AI生成是…

Windows下定时下载Linux服务器的数据库备份文件(pscp+bat脚本+定时任务)

下载传输软件pscp Download PuTTY: latest release (0.79) 创建bat执行脚本 echo 删除旧的备份文件 del D:\db_bk\*.dbecho 下载新的备份文件 D:\Programs\pscp -P 22 -pw youPassword youName192.168.1.1:/home/backup/test.db D:\db_bk\ 设置定时任务 1.使用任务计划程…

2023年【天津市安全员C证】报名考试及天津市安全员C证操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证报名考试是安全生产模拟考试一点通生成的&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2023年【天津市安全员C证】报名考试及天津市…

代码与细节(一)

在用到 Java17的新特性 Unmodifiable Lists 时不知道你是否和我有同样的惊讶 为什么弄了这么多重载方法&#xff1f; 先说结论&#xff1a;为了性能。 其实一细想&#xff0c;都能想明白&#xff1a;varargs(可变参数) 的背后是数组的内存分配和初始化&#xff0c;相比正常的…

36张图详解网络基础知识

下午好&#xff0c;我的网工朋友。 在网工这行&#xff0c;只要是面试&#xff0c;一般都难逃网络协议相关的问题吧。 不管是OSI还是TCP/IP&#xff0c;这都是非常重要、基础的知识&#xff0c;很多知识点都是以它们为基础去串联的。 作为网络世界的底层技术&#xff0c;掌握…

外贸行业常用英文邮件模板分享

外贸邮件营销可以帮助企业扩大客户群、提高客户忠诚度、降低营销成本、提高营销效果、增强客户沟通和提高客户满意度等方面具有重要作用和优势&#xff0c;U-Mail邮件营销平台给大家分享一些外贸企业常用的英文邮件模板 以下是一些英文邮件模板案例&#xff0c;供您参考&#x…

使用Axure RP和内网穿透技术制作静态站点并实现公网访问

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

【LeetCode:1726. 同积元组 | 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Echarts:双折线图的值一样,高度却不一样

问题 在使用Echarst绘制双折线图的时候&#xff0c;2条线在相同的横坐标下&#xff0c;y轴的值是一样的&#xff0c;但是展示在图上的时候2条折线在那个横坐标值下的高度却不一样即xx1时&#xff0c;y12&#xff0c;y22&#xff0c;但是显示在图上的却是&#xff1a;xx1时&…

Kafka Tool(Kafka 可视化工具)安装及使用教程

Kafka Tool&#xff08;Kafka 可视化工具&#xff09;安装及使用教程 Kafka Tool 工具下载 下载地址 http://www.kafkatool.com/download.html 下载界面 不同版本的Kafka对应不同版本的工具&#xff0c;个人使用的是2.11&#xff0c;所以下载的是最新的2.0.8版本&#xff…

璞华科技再次赋能,助力成都市温江区“码”上维权不烦“薪” !

科技赋能护“薪”行动 “码”上维权不烦“薪” 为保障劳动者工资收入的合法权益&#xff0c;提升人社部门智能化咨询服务能力&#xff0c;2023年10月17日&#xff0c;成都市温江区人力资源和社会保障局发布“码上护薪”小程序&#xff0c;助力劳动者“码”上维权不烦”薪”。…

Ant Design Form表单组件手动清楚校验信息(提示文字及红框)

出现场景 当我们的表单项是按条件验证的情况&#xff0c;或者该表单项是不可编辑然后是关联赋值&#xff08;比如选择某个下拉框&#xff0c;赋上关联值&#xff09;&#xff0c;并且你还先点击了按钮进行验证&#xff0c;那么即使赋上了值也不能触发该表单二次验证。所以就需…

ZGC关键技术分析

一、引言 垃圾回收对于Javaer来说是一个绕不开的话题&#xff0c;工作中涉及到的调优工作也经常围绕垃圾回收器展开。面对不同的业务场景没有一个统一的垃圾回收器能保证可GC性能。因此对程序员来说不仅要会编写业务代码&#xff0c;同时也要卷一下JVM底层原理和调优知识。这种…