代码随想录算法训练营Day55|392.判断子序列、115.不同的子序列

单光子雪崩二极管(SPAD):原理、极高增益机制与微光探测解析 本文系统阐述了单光子雪崩二极管(SPAD)的工作原理及其在弱光探测中的应用。SPAD通过工作在盖革模式下的碰撞离化效应实现单光子探测,其核心机理包括:1)采用p+-n-n+结构实现高电场分布;2)通过雪崩倍增过程获得10^6量级增益;3)采用主动/被动淬灭机制实现快速恢复。文章详细分析了SPAD的关键性能参数(如光子探测效率、暗计数率等)及其在量子通信、激光雷达等领域的应用优势,揭示了该器件在极微弱光信号探测中的独特价值。 阅读详情

目录

392.判断子序列

思路

​算法实现

115.不同的子序列

思路

 算法实现

总结


392.判断子序列

题目链接

文章链接

思路

         利用动规五部曲进行分析:

1.确定dp数组及其下标含义:

        dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。

2.确定递推公式:

        主要考虑两种情况:

  • 当s[i - 1] == t[j - 1]时,t中找到了一个字符在s中也出现了;
  • 当s[i - 1] != t[j - 1]时,相当于t要删除元素,继续匹配。

        对于第一种情况,dp[i][j] = dp[i - 1][j - 1] + 1因为找到了一个相同的字符,相同子序列长度自然要在dp[i-1][j-1]的基础上加1;

        对于第二种情况,此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];

3.dp数组初始化

        又由递推公式可知dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][j]和dp[i][0]是一定要初始化的。

        因为在定义dp数组时就是以下标i - 1和j - 1为结尾,因此当i = 0和j = 0时都是本身没有意义的,其他下标的初值对结果没有影响,为了方便可以都初始化为0;

4.确定遍历顺序:

        从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右,如图所示:

5.打印dp数组:

        以示例一为例,输入:s = "abc", t = "ahbgdc",dp状态转移图如下:

 算法实现

class Solution {
public:
    bool isSubsequence(string s, string t) {
        vector<vector<int>> dp(s.size() + 1, vector<int> (t.size() + 1, 0));
        for (int i = 1; i <= s.size(); i++) {
            for (int j = 1; j <= t.size(); 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];
            }
        }
        if (dp[s.size()][t.size()] == s.size()) return true;
        return false;
    }
};

115.不同的子序列

题目链接

文章链接

思路

         利用动规五部曲进行分析:

1.确定dp数组及其下标的含义:

        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]与t[j - 1]的匹配,那么个数为dp[i - 1][j - 1],另一部分是不论当前是否相等,前面的字符匹配到t[j]传递下来的基项,个数为dp[i - 1][j];

        当s[i - 1]与t[j - 1]不相等时,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][j] 是从上方和左上方推导而来,如图:,那么 dp[i][0] 和dp[0][j]是一定要初始化的。

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

        当s中的所有元素删除即为空字符串,有且仅有唯一情况,因此dp[i][0]初始化为1;

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

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

        特殊位置dp[0][0]应该按照dp[i][0]的思路来,空字符串s,可以删除0个元素,变成空字符串t,因此赋值为1;

4.确定遍历顺序:

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

        

5.打印dp数组:

        以s:"baegg",t:"bag"为例,推导dp数组状态如下:        

 算法实现

class Solution {
public:
    int numDistinct(string s, string t) {
        vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t> (t.size() + 1, 0));
        for (int i = 0; i <= s.size(); i++) dp[i][0] = 1;
        for (int j = 1; j <= t.size(); j++) dp[0][j] = 0;
        for (int i = 1; i <= s.size(); i++) {
            for (int j = 1; j <= t.size(); 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];
            }
        }
        return dp[s.size()][t.size()];
    }
};

总结

        今天练习的两道题目依然是子序列问题,一样的处理方法简化dp数组初始化,但是在具体实现上还是比较困难的,第一次尝试没有什么思路。

VTK API 详解(134):vtkOBJWriter - 写入 OBJ 模型 是 VTK 中用于将数据写入 Wavefront OBJ 文件格式的类。OBJ 格式是广泛支持的 3D 网格模型格式,支持顶点、面和基本几何信息的保存,便于模型在多种三维软件间交换。 阅读详情

相关推荐

用Zotero+B站Kimi,我如何把一篇顶会论文快速做成组会PPT(含完整提示词)

本文介绍如何利用Zotero和Kimi快速将顶会论文转化为组会PPT,提升学术汇报效率。通过Zotero的文献管理插件和Kimi的AI提炼技术,实现从论文阅读到PPT生成的全流程自动化,帮助研究者在90分钟内完成高质量汇报准备。

weixin_30955617的博客 499

代码随想录算法训练营day55 | 392.判断子序列,115.不同的子序列

子序列(编辑距离)

jzh013的博客 807

【计算机视觉】pyrealsense2:Intel RealSense 深度相机的 Python 接口实战指南

pyrealsense2:Intel RealSense 深度相机的 Python 接口实战

weixin_43988131的博客 4350

代码随想录算法训练营Day55 | 392. 判断子序列 | 115. 不同的子序列

但实际上,这是一道特殊版本的最长公共子序列,同时也是编辑距离的入门。看到多少种方法 + 子序列,第一反应是回溯所有的子序列,然而数据量很明显不可能支持回溯,题目难度也没有到必须暴力搜索的地步。题目要求判断 s 是否是 t 的子序列,其实相当于要求 s 和 t 的最大公共子序列的长度就是。dp 数组的初始化:对于当前的定义,初始化和之前是一样的,都是针对第一行和第一列进行单独的初始化。dp 数组的初始化:根据递推公式的要求,还是要初始化第一行和第一列。的递推公式进行了很长的讨论。的含义是反的,但不影响解题。

Kolbe_Huang的博客 468

从零开始解析N-CMAPSS数据集:航空发动机健康管理的入门指南

本文详细解析了N-CMAPSS数据集在航空发动机健康管理中的应用,从数据集的构成、关键变量到实际数据分析方法,为初学者提供了全面的入门指南。通过Python代码示例,展示了如何加载、探索和建模这一复杂数据集,帮助读者掌握航空发动机性能预测的核心技术。

weixin_29063979的博客 320

解决创建conda环境时Solving environment: failed 和 ResolvePackageNotFound 的错误

环境配置文件是在别的机器上导出的,文件里的软件包是按照导出文件的机器配置的,因此导出的时候,把这些包的详细信息也导了出来,即第二个等号后面跟着的信息,当我们按照这个文件创建环境时,conda就会根据我们机器的配置信息,按照配置文件里包的详细信息,去找这个包,那当然找不到,结果发现“查无此包”,因此也就会报上面的错误。上面找到了问题的所在之处,解决起来就很简单了,只需要在配置文件 environment.yml 中将包的详细信息删除,也就是第二个等号后面的内容。然而升级超级慢不说,也没有解决我的问题。...

番茄炒蛋三分糖 4万+

代码随想录算法训练营三刷day55 | 动态规划之子序列 392.判断子序列 115.不同的子序列

例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。是以下标i为结尾的字符串s和以下标j为结尾的字符串t,初始化就比较麻烦了。表示以下标i-1为结尾的字符串,与空字符串的相同子序列长度,所以为。:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。为结尾的s,删除所有元素,出现空字符串的个数就是1。

baimaozi_007的博客 1183

Ubuntu22.04系统安装及配置

下载Ubuntu22.04系统镜像(下载地址:链接:https://caiyun.139.com/m/i?提取码:fLRJ),结合rufus和系统镜像制作USB启动盘,在物理机服务器上通过USB启动盘进行安装;或通过Esxi虚拟化平台创建虚拟机,然后在虚拟机中使用系统镜像进行安装。

cheagoun的博客 8万+

代码随想录算法训练营day55|392.判断子序列 |115.不同的子序列

t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么。][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度,所以如果。表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为。与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1。:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为。

xinrenne的博客 195

yocto系列讲解[实战篇]54 - 添加Qt5和生成带Qt5的SDK

为了满足读者盆友想看yocto如何添加qt5的需求,今天就开始尝试添加meta-qt5

fulinux的博客 3871

手把手教你学simulink(16.8)--基于Simulink的小波变换滤波器(Wavelet Transform Filter)项目

基于Simulink的小波变换滤波器(Wavelet Transform Filter)项目的详细实例介绍。这个项目将重点放在小波变换滤波器的设计、实现和仿真上,帮助你理解和应用小波变换滤波器在信号处理中的作用。

MHD0815的博客 534

代码随想录算法训练营day55|392.判断子序列,115.不同的子序列

动态规划day15

weixin_52121600的博客 323

RT-DETR改进策略【损失函数篇】| 2024 引进Focaler-IoU损失函数 加强边界框回归 (Focaler-DIoU、Focaler-GIoU、Focaler-CIoU等)

本文记录的是改进RT-DETR的损失函数,将其替换成。现有研究通过利用边界框之间的几何关系来提高回归性能,但忽略了困难样本和简单样本分布对边界框回归的影响。不同检测任务中困难样本和简单样本的分布不同,对于简单样本占主导的检测任务,关注简单样本的边界框回归有助于提高检测性能;对于困难样本比例较高的检测任务,需要关注困难样本的边界框回归。,提高检测器在不同检测任务中的性能。实现的。

Limiiiing的博客 1922

代码随想录算法训练营day 55 |392.判断子序列、115.不同的子序列

代码随想录算法训练day 55

wuhuqifei123的博客 299

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

代码随想录算法训练营day55| 392.判断子序列、115.不同的子序列

动态规划

weixin_45368277的博客 348

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

代码随想录算法训练营 day55 | 392.判断子序列、115.不同的子序列

如果第i-1和j-1元素相等,那么就有两种可能,考虑i-1的元素和不考虑i-1的元素含有的到第j-1的子序列个数。dp[i][j]表示字符串A从0-i-1与字符串B 从0-j的最长公共子序列的长度。思路:利用最长公共子序列,只有当最长公共子序列的长度等于s的长度,那么返回true。否则dp[i][j]=max(dp[i][j-1],dp[i-1][j])dp[i][j]表示字符串A从0-i-1中含有的字符串B从0-j-1的个数。

qq_42591713的博客 158

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

代码随想录算法训练营day55 392.判断子序列 115.不同的子序列

【代码】代码随想录算法训练营day55 392.判断子序列 115.不同的子序列。

m0_74100262的博客 505

代码随想录算法训练营day55 || ● 392.判断子序列 ● 115.不同的子序列

思路:该题没有要求连续,所以匹配过程中需要删除一些节点,dp[i][j]表示t的第i个元素中出现s的个数,若最后的dp长度等于T的长度即表示为子序列。第二题难度不小,做了快一个小时,最后发现其关键无非与找dp代表的含义,确定后再寻找上一阶段与下一阶段的关系,最后确定遍历顺序即可。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。题目数据保证答案符合 32 位带符号整数范围。

weixin_56969073的博客 306

代码随想录算法训练营 Day 55 | 392.判断子序列,115.不同的子序列

【代码】代码随想录算法训练营 Day 54 | 392.判断子序列,115.不同的子序列。

MisakaMirai的博客 279

代码随想录算法训练营Day55动态规划:392.判断子序列,115.不同的子序列

代码随想录算法训练营Day55动态规划:392.判断子序列,115.不同的子序列

weixin_57956443的博客 403

代码随想录算法训练营 | day55 动态规划 392.判断子序列,115.不同的子序列

t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp。

weixin_45011378的博客 180

代码随想录算法训练营 day55|392.判断子序列、115.不同的子序列

和最长公共子序列相似,不同之处在于这一道题只有母序列(较长的序列)可以进行删除操作,体现在遍历中就是除了左上方之外,上方和下方只有一个可以转移过来。

weixin_42179093的博客 252

代码随想录算法训练营Day55 | 392.判断子序列,115.不同的子序列

392.判断子序列,115.不同的子序列

weixin_44687153的博客 369

代码随想录算法训练营day55 | LeetCode 392. 判断子序列 115. 不同的子序列

类似,可以看做是其一种特殊情况。两个元素不相等的时候也可以直接dp[i][j]=dp[i-1][j]。思路:第一次做,有点没太理解。

DSZ___的博客 273

代码随想录算法训练营-day55-392. 判断子序列、115. 不同的子序列

代码随想录算法训练营-day55-392. 判断子序列、115. 不同的子序列

weixin_47067912的博客 248

代码随想录算法训练营day55|392.判断子序列115.不同的子序列 剑指offer15、65

思路:n-1会把二进制最右边的1变成0,并且把这个1右边所有的0变成1,也就是会反转,前面不变,然后我们让n和n-1按位与,就会把反转部分都变成0,也就是消除一次1,我们就进行一次res+1。当然都删除也是对的,只是本题没有必要,因为如果满足条件的话,s串的元素一定是全被包括在内的。方法二:用&和^进行运算,&运算(1&1=1)是不考虑加法的进位运算,再左移一位就是要加进位数的位置。^运算(1^1=0,1^0=1)是不考虑进位的加法运算,所以两者结合一下。

weixin_44735258的博客 183
上一篇: 代码随想录算法训练营Day53|1143.最长公共子序列、1035.不相交的线、53. 最大子序和
下一篇: 代码随想录算法训练营Day56|583. 两个字符串的删除操作、72. 编辑距离
张金卓2023
博客等级 码龄5年 1045粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值