代码随想录算法训练营第五十五天| LeetCode392. 判断子序列、LeetCode115. 不同的子序列

news2024/11/19 9:33:59

一、LeetCode392. 判断子序列

        1:题目描述(392. 判断子序列)

        给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

        字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace""abcde"的一个子序列,而"aec"不是)。

        2:解题思路

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        # 动态规划
        # 确认dp数组的含义
        # dp[i][j]表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]
        # 确认递推公式
        # 分两种情况:s[i]==t[j], s[i]!=t[j]
        # 1:s[i]==t[j]:说明字符串s中的字符在t中出现了,dp[i][j] = dp[i-1][j-1]+1
        # 2:s[i]!=t[j]:相当于t要删除元素,继续匹配;t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];
        # 初始化
        # 从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的
        # dp[i][0] 表示以下标i-1为结尾的字符串,与空字符串的相同子序列长度,所以为0. dp[0][j]同理
        # 确定遍历顺序
        # 从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右
        # dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度
        # 所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。
        s_len = len(s)
        t_len = len(t)
        if t_len < s_len:
            return False
        dp = [[0 for _ in range(t_len+1)] for _ in range(s_len+1)]
        for i in range(1, s_len+1):
            for j in range(1, t_len+1):
                if s[i-1] == t[j-1]:
                    dp[i][j] = dp[i-1][j-1]+1
                else:
                    dp[i][j] = dp[i][j-1]
        if dp[-1][-1] == s_len:
            return True
        else:
            return False

二、LeetCode115. 不同的子序列

        1:题目描述(115. 不同的子序列)

        给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。

        字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)

        题目数据保证答案符合 32 位带符号整数范围。

        2:解题思路

        1:确定dp数组(dp table)以及下标的含义

        dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。

        2:确定递推公式

        这一类问题,基本是要分析两种情况

  • s[i - 1] 与 t[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[i - 1]来匹配,个数为dp[i - 1][j]。

        为什么还要考虑 不用s[i - 1]来匹配,都相同了指定要匹配啊

        例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。

        当然也可以用s[3]来匹配,即:s[0]s[1]s[3]组成的bag。

        所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

        当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配,即:dp[i - 1][j]

        所以递推公式为:dp[i][j] = dp[i - 1][j];

        3:dp数组如何初始化

        从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][0] 和dp[0][j]是一定要初始化的。

        dp[i][0]表示什么呢?

        dp[i][0] 表示:以i-1为结尾的s可以随便删除元素,出现空字符串的个数。

        那么dp[i][0]一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1。

        再来看dp[0][j],dp[0][j]:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。

        那么dp[0][j]一定都是0,s如论如何也变成不了t。

        最后就要看一个特殊位置了,即:dp[0][0] 应该是多少。

        dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t

        4:确定遍历顺序

        从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j]都是根据左上方和正上方推出来的。

class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        # 动态规划
        # 确认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]
        # 1:当s[i-1] == t[j-1],dp[i][j]由两部分组成
        # 一部分是用s[i-1]来匹配,dp[i][j] = dp[i-1][j-1]
        # 一部分是不用s[i-1]来匹配,dp[i][j] = dp[i-1][j]
        # 为什么要考虑 不用s[i - 1]来匹配
        # 例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。
        # 也可以用s[3]来匹配,即:s[0]s[1]s[3]组成的bag。
        # 所以当s[i-1] 与 t[j-1]相等时,dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
        # 当s[i-1] 与 t[j-1]不相等时,dp[i][j]只有一部分组成,不用s[i-1]来匹配,即:dp[i-1][j]
        # 所以递推公式为:dp[i][j] = dp[i-1][j];
        # 初始化
        # dp[i][0] = 1, dp[0][j] = 0, dp[0][0] = 1
        # 确认遍历顺序
        # 从上到下,从左到右
        s_len = len(s)
        t_len = len(t)
        dp = [[0 for _ in range(t_len+1)] for _ in range(s_len+1)]
        for i in range(s_len):
            dp[i][0] = 1
        for j in range(1, t_len):
            dp[0][j] = 0
        for i in range(1, s_len+1):
            for j in range(1, t_len+1):
                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]
        return dp[-1][-1]

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

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

相关文章

SSAT Essay 类写作 - 五步法

从去年起&#xff0c; SSAT 写作转向重点考察critical thinking的考察&#xff0c;SSAT middle 由2篇Story 题目转为一篇Story和一篇Essay, SSAT upper 由 1篇Story 和1 篇Essay 转为 2 篇Essay。这就意味着写好Essay 是SSAT 写作的必备能力。 Essay 写作的要求 体现Critica…

uniapp 实现在线签合同/签名/信息认证(无插件依赖)

最近项目接到一个新的需求&#xff0c;需要对接一个可以在线签合同的的功能&#xff0c;知道需要后马上开干&#xff0c;经过一番斗争&#xff0c;终于终于下班啦 开个玩笑&#xff0c;废话不多说&#xff0c;直接上代码&#xff0c;因为代码是直接项目中搬出来的&#xff0c;没…

把苦难的时光删去:从小县城售货员到深圳IT白领的蜕变之路

希望就像石头缝里的花&#xff0c;有种子就会发芽。 初中辍学&#xff0c;家具店打工&#xff0c;原生家庭带给我太多伤 几乎是所有重男轻女家庭共有的悲剧&#xff0c;我的学习生涯在中考之后寥寥收了场&#xff0c;中考失利&#xff0c;母亲本着“女子无才便是德”的观念不同…

CSS基础

文章目录学习CSS的目的引入的三种方式内部样式表行内样式表外部样式表选择器的分类基础选择器标签选择器类选择器id选择器通配符选择器复合选择器后代选择器子选择器并集选择器伪类选择器盒子模型不同浏览器下盒子模型的区别边框内边距外边距去除浏览器默认样式元素的显示模式块…

Bug系列路径规划算法原理介绍(二)——BUG1 BUG2算法

本系列文章主要对Bug类路径规划算法的原理进行介绍&#xff0c;在本系列的第一篇文章中按照时间顺序梳理了自1986年至2018年Bug类路径规划算法的发展&#xff0c;整理了13种BUG系列中的典型算法&#xff0c;从本系列的第二篇文章开始依次详细介绍了其中具有代表性的BUG1、BUG2、…

面试官:高并发场景下,你们是怎么保证数据的一致性的?图文详解

面试的时候&#xff0c;总会遇到这么一个场景。 1. 场景分析 面试官&#xff1a;你们的服务的QPS是多少&#xff1f; 我&#xff1a;我们的服务高峰期访问量还挺大的&#xff0c;大约是3万吧。 面试官&#xff1a;这么大的访问量&#xff0c;你们的服务器能撑住吗&#xff…

自学unity,该不该阻止?

看清现状&#xff0c;展望未来 进入游戏公司前 进入游戏行业一大契机&#xff1a;在校生身份。各大厂同一个岗位对校招和社会招聘的要求不是一个维度。从学校校招生的身份毕业成为社会人&#xff0c;按照再给两年来算&#xff0c;两年后技术会如何革新&#xff1f;各大公司的招…

【苹果推群发iMessage推】软件安装个性化必要高度 - (void) updateListH

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

MySQL8.0.26—Linux版安装详细教程

❤ 作者主页&#xff1a;Java技术一点通的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是Java技术一点通&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得关注、点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习&#xff0c;共同进步&#xff01;&am…

Network error: Connection refused

Network error: Connection refused1 问题的现象2 确认vmware ubuntu侧ssh是否启动2.1 确认ubuntu侧ssh的状态2.2 重启ssh服务2.3 安装ssh1 问题的现象 在用mobaXterm ssh去链接vmware虚拟机ubuntu时一直报下面的错误。 出现该问题之后我做了下面的检测&#xff1a; 检查vmw…

腾讯云年终选购云服务器攻略!

随着云计算的快速发展&#xff0c;很多用户都选择上云&#xff0c;上运中最常见的产品就是云服务器CVM和轻量应用服务器了&#xff0c;那么怎么选购最优惠呢&#xff0c;这篇文章将介绍新老用户选购腾讯云服务器的几个优惠方法。 一、买赠专区 第一个介绍的就是买赠专区&…

在kubernetes中对pod使用tcpdump+wireShark进行抓包

1.查看pod信息&#xff0c;获得pod所在的宿主机 kubectl get pod -n demo -o wide 2.获取宿主机的详情 kubectl get node zeebe.node1 -o wide 3.ssh连接到宿主机 ssh 用户名10.10.11.202 4.查看容器ID&#xff0c;使用POD名称中的关键字进行查找 docker ps|grep nodeapp 5…

java计算机毕业设计ssm图书馆预约管理系统txke6(附源码、数据库)

java计算机毕业设计ssm图书馆预约管理系统txke6&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

【Shell 脚本速成】07、Shell 流程控制——if 判断语句

目录 一、if 介绍 二、单 if 语法 三、if…else 语句 四、if…elif…else 五、if 嵌套 if 5.1 使用 if 嵌套 if 的方式判断两个整数的关系 5.2 写一个nginx安装初始化脚本 六、if 语句与 shell 运算 6.1 与文件存在与否的判断 6.2 文件权限相关的判断 6.3 整数之间…

【数据结构】建堆的方式、堆排序以及TopK问题

建堆的方式、堆排序以及TopK问题1、建堆的两种方式1.1 向上调整建堆1.2 向下调整建堆2、堆排序3、TopK问题4、建堆、堆排序、TopK问题全部代码1、建堆的两种方式 我们知道&#xff0c;堆是二叉树的一种&#xff0c;二叉树的建立是借助结构体与数组完成的&#xff08;通过在结构…

扫描电镜下的人体感官结构,超震撼

我们对自己的感官最熟悉不过了&#xff0c;但是如果把这些器官放大一千倍一万倍&#xff0c;你还能分辨出来吗&#xff1f;能做到这一点的不是普通的光学显微镜&#xff0c;而是电子显微镜。 电子显微镜可以将物体放大近300000倍&#xff0c;其分辨率可达1纳米&#xff08;10-9…

Minio学习

目录 一、概述 1、Minio介绍 2、Minio的基础概念 3、Minio安装 3.1、Docker容器中安装 3.2、Windows运行安装 4、分布式Minio优势 数据保护 高可用 一致性 5、Minio客户端使用 6、SpringBoot工程引入Minio 一、概述 Minio分布式文件系统。 Minio是一个基于Apache…

客服回复差评的话术模板

当店铺出现差评时&#xff0c;客服首先要去与客户进行沟通&#xff0c;帮助客户解决问题&#xff0c;尽可能去消除差评&#xff1b;如果客户不愿意沟通&#xff0c;无法消除差评的情况下&#xff0c;客服也要及时对差评进行回复。 前言 对于开网店的店主来说&#xff0c;客户…

如何搭建一个自己的音乐服务器

点赞再看&#xff0c;动力无限。 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录&#xff0c;有很多知识点和系列文章。 最近发现&#xff0c;经常用的网易云音乐&#xff0c;有很多歌曲下架了&#xff0c;能听的越来越少了&#xff1b;…

【电气安全】安科瑞电气火灾监控系统在江苏某大学中设计与应用

摘要&#xff1a;本文以安科瑞电气火灾系统在江苏大学科技园的应用为案例&#xff0c;介绍电气火灾系统实现对现场设备的系统集成&#xff0c;数据的采集、传输以及存储&#xff0c;验证了该系统的功能及实用性。 关键词&#xff1a;江苏大学科技园&#xff1b;电气火灾系统&a…