Studying-代码随想录训练营day45| 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

第45天,子序列part03,编辑距离💪(ง •_•)ง,编程语言:C++

目录

115.不同的子序列

583. 两个字符串的删除操作 

72. 编辑距离

编辑距离总结篇


115.不同的子序列

文档讲解:代码随想录不同的子序列

视频讲解:手撕不同的子序列

题目:115. 不同的子序列 - 力扣(LeetCode)

学习:本题是392.判断子序列题目的扩展,本题需要求t在s中出现的次数。首先我们需要确定的就是t是否在s中出现。本题如果不是子序列,而是连续序列,可以考虑采用KMP算法进行求解。

从动归五部曲出发进行求解:

1.确定dp数组,以及下标的含义:本题可设置一个二维数组,dp[i][j]表示以i - 1为结尾的s的子序列中以j - 1为结尾的t出现的个数为dp[i][j]。

2.确定递归公式:首先我们在遍历的过程中需要判断的是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 - 1][j]来判断,如果使用则是dp[i - 1][j - 1],最后得到:dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]

如果s[i - 1]与t[i - 1]不等,则说明当前未匹配,我们只能依靠dp[i - 1][j]。

3.初始化dp数组:显然根据递推公式,我们需要初始化第一行和第一列。第一行表示s为空串的时候,t出现的个数,显然为0;第一列表示t为空串的时候,在s中出现的个数,显然为1个。因此我们可在创建数组的时候,初始化为0,后把第一列,赋值为1,

4.确定遍历顺序,根据递推公式,我们需要依靠上方和左上方的元素,因此我们应该从上到下,从左到右进行遍历。

5.举例推导dp数组:

代码:

//时间复杂度O(m*n)
//空间复杂度O(m*n)
class Solution {
public:int numDistinct(string s, string t) {//动态规划,难题,很难//1.设置dp数组以及下标的含义vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1, 0));//2.确定递推公式//当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] = dp[i - 1][j];//3.初始化dp数组:初始化第一行和第一列//dp[i][0] 表示空字符串,[0-(i-1)]出现的个数,显然为1for(int i = 0; i <= s.size(); i++) {dp[i][0] = 1;}//dp[0][j] 表示[0-(j-1)],在空字符串中出现的个数,显然为0//4.确定遍历顺序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()];}

583. 两个字符串的删除操作 

文档讲解:代码随想录两个字符串的删除操作

视频讲解:手撕两个字符串的删除操作

题目:583. 两个字符串的删除操作 - 力扣(LeetCode)

学习:首先本题有一个直观的思路,本题要通过删除字符使得两个字符串相同,则我们可以先求得两个字符串的最长公共子序列。之后每个字符串都需要删减到最长公共子序列的长度即可,最后所需要的最小步数就为:两个字符串的长度之和 - 最长公共子序列*2。

其次本题还可以通过动态规划的办法进行求解:

1.确定dp数组以及下标的含义:本题我们同样可以设置一个二维dp数组,dp[i][j]表示以 i - 1结尾的字符串word1和以 j - 1结尾的字符串word2相同所需要的最少步骤。

2.确定递推公式:首先遍历过程需要判断的是word1[i - 1] 和 word2[j - 1]是否相等。

如果word1[i - 1]与word2[j - 1]相等,则说明当前元素的是相同,那么我们只要保证前面的元素相同就行,因此最少步骤应该为dp[i - 1][j - 1];

如果word1[i - 1]与word2[j - 1]不相等,则说明当前元素是不等的,我们需要进行删除操作。我们可以选择删除word1[i-1[也可以选择删除word2[j-1],当然我们也可以选择两个都删除,只不过,两个都删除的情况,是包含在每个单独删除的情况里面的。然后我们选最少的步骤,则应该是:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i][j] + 2)

3.递推公式初始化:根据递推公式,我们需要依靠左上方,上方,和左边的元素,因此我们应该初始化第一行和第一列。首先第一行表示:word1在是空串的时候,word2需要进行删除的操作,显然word2需要删除到成为空串,则应该是dp[0][j] = j。同理第一列表示word2为空串的时候,则dp[i][0] = i;

4.确定遍历顺序:显然需要从上到下,从左到右进行遍历。

5.举例推导dp数组:

代码:

//时间复杂度O(n*m)
//空间复杂度O(n*m)
class Solution {
public:int minDistance(string word1, string word2) {//动态规划,难题//1.确定dp数组以及下标的含义vector<vector<int>> dp(word1.size() + 1, vector<int> (word2.size() + 1, 0));//2.确定递推公式:判断两种情况//当word1[i - 1] 与 word2[j - 1]相同的时候:dp[i][j] = dp[i - 1][j - 1];//当word1[i - 1] 与 word2[j - 1]不相同的时候:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);//3.初始化dp数组,初始化第一行和第一列for(int i = 0; i <= word1.size(); i++) {dp[i][0] = i;}for(int j = 0; j <= word2.size(); j++) {dp[0][j] = j;}//4.确定遍历顺序for(int i = 1; i <= word1.size(); i++) {for(int j = 1; j <= word2.size(); j++) {if(word1[i - 1] == word2[j - 1]) {dp[i][j] = dp[i - 1][j - 1];}else {dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);}}}return dp[word1.size()][word2.size()];}
};

72. 编辑距离

文档讲解:代码随想录编辑距离

视频讲解:手撕编辑距离

题目: 72. 编辑距离 - 力扣(LeetCode)

学习:本题是前面题目的集大成之题,是动态规划解决的经典题目之一 。本题允许删除,替换,插入三个操作。前面的题型一般只包含一个字符串的删除操作,或者两个字符串的删除操作,因此本题实际上只是对于字符串需要考虑的操作要多一项。

从动归五部曲出发进行分析:

1.确定dp数组以及下标的含义:本题我们可以设置一个二维dp数组,dp[i][j]表示以i - 1结尾的字符串word1,和以j - 1结尾的字符串word2,最近的编辑距离为dp[i][j](变成相同字符串所需要的步骤)。

2.确定递推公式:我们在遍历的过程中,同样是需要比较word1[i - 1]和word2[j - 1]。

word1[i - 1]和word2[j - 1]相等,则不需要操作,则dp[i][j] = dp[i - 1][j - 1]

word1[i - 1]和word2[j - 1]不相等,则需要进行操作,需要注意插入和删除实际上是一个操作,因为删除一个项相等和插入一个项使其相等,所需要的步骤是一样的,因此三个步骤可以简化为两个步骤:删除(插入)和替换。对于删除操作来说,可以选择删除word1[i - 1],也可以选择删除word2[j - 1]对于替换来说就是将当前的数替换为相等的,则应该是dp[i-1][j - 1] + 1; 综上:dp[i][j] = min(dp[i - 1][j] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1));

3.初始化dp数组,显然我们需要初始化第一行和第一列,对于第一行来说,表示word1为空时,需要的操作,显然dp[0][j] = j; 对于第一列来说,表示word2为空时,需要的操作,显然dp[i][0] = i。

4.确定遍历顺序,显然我们需要从上往下,从左往右进行遍历

5.距离dp数组:

代码:

//时间复杂度O(n*m)
//空间复杂度O(n*m)
class Solution {
public:int minDistance(string word1, string word2) {//动态规划,很难//1.确定dp数组以及下标含义vector<vector<int>> dp(word1.size() + 1, vector<int> (word2.size() + 1, 0));//2.确定递推公式//3.初始化dp数组:初始化行和列for(int i = 0; i <= word1.size(); i++) {dp[i][0] = i;}for(int j = 0; j <= word2.size(); j++) {dp[0][j] = j;}//4.确定遍历顺序for(int i = 1; i <= word1.size(); i++) {for(int j = 1; j <= word2.size(); j++) {if(word1[i - 1] == word2[j - 1]) {dp[i][j] = dp[i - 1][j - 1];}else {dp[i][j] = min(dp[i - 1][j] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1));}}}return dp[word1.size()][word2.size()];}
};

编辑距离总结篇

文档讲解:代码随想录编辑距离总结

编辑距离是动态规划的经典例题之一,我们需要十分注意。

在做编辑距离题目之前,我们首先通过了三道题进行铺垫。

392.判断子序列:本题告诉了我们如果判断一个序列是否为另一个的子序列。从题意中我们也可以发现,只需要计算删除的情况,不用考虑增加和替换的情况,而且是只针对t序列的删除。最后我们想要找到的就是最长公共子序列的长度等于s.size()。

115.不同的子序列:本题要计算s在t出现的个数,本题和上一题基本上是一样的,只是要多考虑次数的情况。

583.两个字符串的删除操作:本题增加了对两个字符串的删除操作,整体思路不变。

72.编辑距离:本题增加了替换的操作,需要考虑的部分增加了,最终解决编辑距离问题。

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

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

相关文章

分布式搜索引擎ES--Elasticsearch集群

1.Elasticsearch集群的概念 分片机制&#xff1a;每个索引都可以被分片 索引my_doc只有一个主分片&#xff1b;索引shop有三个主分片&#xff1b;索引shop2有5个主分片;(参考前面案例) 每个主分片都包含索引的数据&#xff0c;由于目前是单机&#xff0c;所以副分片是没有的&a…

安全开发第一篇

文章目录 参与RASP、IAST等安全防护工具的开发技术背景开发流程技术挑战工具和资源示例结论 以phpstudydvwa为列 实现 SQL 注入检测脚本 参与RASP、IAST等安全防护工具的开发 参与 RASP&#xff08;Runtime Application Self-Protection&#xff09;和 IAST&#xff08;Intera…

为开源奉献一份自己的力量:Cesium没有热力图组件,我们自己封装!

大家好&#xff0c;我是日拱一卒的攻城师不浪&#xff0c;专注可视化、数字孪生、前端提效、nodejs、AI学习、GIS等学习沉淀&#xff0c;这是2024年输出的第27/100篇文章。 交流合作&#xff1a;brown_7778 前言 热力图&#xff0c;在很多可视化场景开发中会被经常提到&#x…

electron 主进程和渲染进程

最近在整理electron 相关的项目问题&#xff0c;对自己来说也是温故知新&#xff0c;也希望能对小伙伴们有所帮助&#xff0c;大家共同努力共同进步。加油&#xff01;&#xff01;&#xff01;&#xff01; 虽然最近一年前端大环境不好&#xff0c;但是大家还是要加油鸭&#…

网安零基础入门神书,全面介绍Web渗透核心攻击与防御方式!

Web安全是指Web服务程序的漏洞&#xff0c;通常涵盖Web漏洞、操作系统洞、数据库漏洞、中间件漏洞等。 “渗透测试”作为主动防御的一种关键手段&#xff0c;对评估网络系统安全防护及措施至关重要&#xff0c;因为只有发现问题才能及时终止并预防潜在的安全风险。 根据网络安…

【Qt开发】No matching signal for on_toolButton_clicked() 解决方案

【Qt开发】No matching signal for on_toolButton_clicked() 解决方案 文章目录 No matching signal for xxx 解决方案附录&#xff1a;C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发入门&#xff09;C语言与C的不同C中写C语言代码C语言到C的知识点Qt开发中…

Linux安装青龙面板并将本地服务映射至公网实现远程访问

文章目录 前言一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 …

全局异常 @ControllerAdvice 该怎么写

本文首发于稀土掘金&#xff1a;全局异常 ControllerAdvice 该怎么写&#xff0c;该账号即为本人账号&#xff0c;非搬运。 问题由来 很多小伙伴刚进公司做项目的时候&#xff0c;会看到项目里面有一个ControllerAdvice标记的类&#xff0c;整个类的编码结构大概是这样子&…

程序员极力推荐的几款插件

前言 h之前分享程序员喜欢的神器之后&#xff0c;还是相当多的伙伴喜欢&#xff0c;那一期的工具不仅是协助你工作还是工作外摸鱼划水&#xff0c;体验感是相当不错的。 这一期我还是打算把我非常喜欢用的几款插件分享给大家&#xff0c;这几款差劲不仅帮助我节省很多时间&am…

2024年软件系统与信息处理国际会议(ICSSIP 2024)即将召开!

2024年软件系统与信息处理国际会议&#xff08;ICSSIP 2024&#xff09;将于2024年10月25-27日在中国昆明举行。引领技术前沿&#xff0c;共谋创新未来。ICSSIP 2024将汇聚来自世界各地的专家学者&#xff0c;他们将在会上分享最新的研究成果、技术突破及实践经验。会议议题涵盖…

WAAP替代传统WAF已成趋势

数字化时代&#xff0c;Web应用和API已成为企业运营的核心。然而&#xff0c;随着网络攻击手段的不断进化&#xff0c;自动化攻击愈发频繁&#xff0c;传统的Web应用防火墙&#xff08;WAF&#xff09;已难以满足现代企业的安全需求。WAAP&#xff08;Web Application and API …

我出一道面试题,看看你能拿 3k 还是 30k!

大家好&#xff0c;我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场&#xff0c;接下来我会出一道经典的后端面试题&#xff0c;你只需要进行 4 个简单的选择&#xff0c;就能判断出来你的水平是新手&#xff08;3k&#xff09;、初级&#xff08;10k&#xff09;、中…

大镜山阿里巴巴国际站数据采集软件使用方法|阿里国际站商家信息采集软件使用方法|阿里国际站信息采集软件使用方法

大镜山阿里巴巴国际站数据采集软件一款采集阿里巴巴国际站alibaba.com商家数据的软件&#xff0c;采集的数据包括店铺名称、店铺年份、评分、邮件地址、手机号码、网址及社交连接等。 下载大镜山阿里巴巴国际站数据采集软件 大镜山阿里巴巴国际站数据采集软件下载地址 大镜山…

ubuntu20.04.6 安装Skywalking 10.0.1

1.前置准备 1.1. **jdk17&#xff08;Skywalking10 jdk22不兼容&#xff0c;用17版本即可&#xff09;**安装&#xff1a; https://blog.csdn.net/CsethCRM/article/details/140768670 1.2. elasticsearch安装&#xff1a; https://blog.csdn.net/CsethCRM/article/details…

Java-21推崇的虚拟线程到底有好快?一起来看这个实验

我们一起来看下面这个场景&#xff1a;十万个待执行任务&#xff0c;每个任务休眠两秒 1. 采用java-21的虚拟线程池来实现 public static void main(String[] args) throws InterruptedException{ExecutorService VIRTUAL_THREAD_POOL Executors.newThreadPerTaskExecutor(Th…

爬虫程序在采集亚马逊站点数据时如何绕过验证码限制?

引言 在电商数据分析中&#xff0c;爬虫技术的应用日益广泛。通过爬虫技术&#xff0c;我们可以高效地获取大量的电商平台数据&#xff0c;这些数据对于市场分析、竞争情报、价格监控等有着极其重要的意义。亚马逊作为全球最大的电商平台之一&#xff0c;是数据采集的重要目标…

pdf文件损坏打不开怎么修复?文档损坏原因和修复办法分享!

pdf是一种优点很多的软件&#xff0c;它在文件传输过程中格式不会乱掉&#xff0c;而且还可以加密&#xff0c;特别的方便。pdf这种文件格式&#xff0c;不仅能呈现文档&#xff0c;还可以呈现图像&#xff0c;工作中经常会用到。 不过&#xff0c;因为种种原因&#xff0c;有…

【iOS】——Block底层实现和捕获机制

Block的实质 Block的定义是带有自动变量的匿名函数&#xff0c;下面从源码的角度探究下Block究竟是什么 下面是一个Block的简单实现&#xff1a; int main(int argc, const char * argv[]) {autoreleasepool {// insert code here...void (^blk)(void) ^{printf("Bloc…

WordPress原创插件:搜索引擎抓取首图seo图片

WordPress原创插件&#xff1a;搜索引擎抓取首图seo图片 插件设置 插件将在网站头部添加适当的meta标签&#xff0c;以便百度等搜索引擎抓取指定的固定图像。 插件下载 https://download.csdn.net/download/huayula/89596527

Docker容器数据库启动,如何用别名JAR jdbc:postgresql://别名:5432/postgres

如果想了解为啥这样做得同学&#xff0c;请去看这个文章 Docker容器网络&#xff08;七&#xff09;_host.docker.internal-CSDN博客 因为docker0网络&#xff0c;需要用别名的话&#xff0c;还得在host文件加 dockerIp(172.0.0.2) 别名 怎么查&#xff0c; docker network …