【动态规划】583. 两个字符串的删除操作、72. 编辑距离

news2024/9/23 14:35:47

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

文章目录

  • 583. 两个字符串的删除操作
    • 💡解题思路
    • 🤔遇到的问题
    • 💻代码实现
    • 🎯题目总结
  • 72. 编辑距离
    • 💡解题思路
    • 🤔遇到的问题
    • 💻代码实现
    • 🎯题目总结
  • 🎈今日心得


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

题目链接:583. 两个字符串的删除操作

💡解题思路

  1. 本题和动态规划:115.不同的子序列 (opens new window)相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的
  2. 动规五部曲
  • 确定dp数组以及下标的含义:dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。
  • 确定递推公式:主要就是两大情况: word1[i - 1] 与 word2[j - 1]相同,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],最少操作次数为dp[i - 1][j] + 1
    情况二:删word2[j - 1],最少操作次数为dp[i][j - 1] + 1
    情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2
    所以递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});
    因为 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2,所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
    从字面上理解 就是 当 同时删word1[i - 1]和word2[j - 1],dp[i][j-1] 本来就不考虑 word2[j - 1]了,那么我在删 word1[i - 1],是不是就达到两个元素都删除的效果,即 dp[i][j-1] + 1。
  • dp数组如何初始化:dp[i][0]:word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同呢,很明显dp[i][0] = i。
    同理dp[0][j] = j
  • 确定遍历顺序:从递推公式,可以看出,有三个方向可以推出dp[i][j]在这里插入图片描述
  • 举例推导dp数组:按照递推公式推导一下做推导,如果发现结果不对,就把dp数组打印出来在这里插入图片描述

🤔遇到的问题

  1. 注意初始化

💻代码实现

动态规划

var minDistance = function(word1, word2) {
    //dp[i][j],以i-1结尾的word1和以j-1结尾的word2,想要达到相等,所需要删除元素的最少次数。
    let w1 = word1.length
    let w2 = word2.length
    let dp = new Array(w1 + 1).fill(0).map(x => new Array(w2 + 1).fill(0))
    //初始化
    //word2为空字符串
    for (let i = 0; i <= w1; i++){
        dp[i][0] = i
    }
    //word1为空字符串
    for (let j = 0; j <= w2; j++){
        dp[0][j] = j
    }
    for (let i = 1; i <= w1; i++){
        for (let j = 1; j <= w2; j++){
            if (word1[i - 1] === word2[j - 1]) {
                dp[i][j] = dp[i-1][j-1]
            } else {
                dp[i][j] = Math.min(dp[i-1][j]+1,dp[i][j-1]+1)
            }
        }
    }
    console.log(dp)
    return dp[w1][w2]
};

🎯题目总结

特别注意的是:此题两个字符床都可以进行删除,所以在初始化和递推公式都会与之前有所不同,需要特别注意


72. 编辑距离

题目链接:72. 编辑距离

💡解题思路

  1. 动规五部曲
  • 确定dp数组以及下标的含义:dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]
  • 确定递推公式:要考虑清楚编辑的几种操作,4种情况
if (word1[i - 1] == word2[j - 1])
    不操作
if (word1[i - 1] != word2[j - 1])
    增
    删
    换

情况1: if (word1[i - 1] == word2[j - 1]) 那么说明不用任何编辑,dp[i][j] 就应该是 dp[i - 1][j - 1],即dp[i][j] = dp[i - 1][j - 1];根据dp[i][j]的定义,word1[i - 1] 与 word2[j - 1]相等了,那么就不用编辑了,以下标i-2为结尾的字符串word1和以下标j-2为结尾的字符串word2的最近编辑距离dp[i - 1][j - 1]就是 dp[i][j]了。
情况2:if (word1[i - 1] != word2[j - 1])时
1、操作一:word1删除一个元素,那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作。即 dp[i][j] = dp[i - 1][j] + 1;
2、操作二:word2删除一个元素,那么就是以下标i - 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上一个操作。即 dp[i][j] = dp[i][j - 1] + 1;
注意:word2添加一个元素,相当于word1删除一个元素,例如 word1 = “ad” ,word2 = “a”,word1删除元素’d’ 和 word2添加一个元素’d’,变成word1=“a”, word2=“ad”, 最终的操作数是一样!
3、操作三:替换元素,word1替换word1[i - 1],使其与word2[j - 1]相同,此时不用增删加元素。if (word1[i - 1] == word2[j - 1])的时候我们的操作 是 dp[i][j] = dp[i - 1][j - 1] 对吧。那么只需要一次替换的操作,就可以让 word1[i - 1] 和 word2[j - 1] 相同。所以 dp[i][j] = dp[i - 1][j - 1] + 1;
综上,当 if (word1[i - 1] != word2[j - 1]) 时取最小的,即:dp[i][j] = min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;

  • dp数组如何初始化:
    dp[i][0] :以下标i-1为结尾的字符串word1,和空字符串word2,最近编辑距离为dp[i][0]。那么dp[i][0]就应该是i,对word1里的元素全部做删除操作,即:dp[i][0] = i;同理dp[0][j] = j;
  • 确定遍历顺序:dp[i][j]是依赖左方,上方和左上方元素的在这里插入图片描述
  • 举例推导dp数组:按照递推公式推导一下做推导,如果发现结果不对,就把dp数组打印出来在这里插入图片描述

🤔遇到的问题

  1. word1[i - 1] != word2[j - 1时的三种情况的分析

💻代码实现

动态规划

var minDistance = function(word1, word2) {
    let w1 = word1.length
    let w2 = word2.length
    let dp = new Array(w1 + 1).fill(0).map(x => new Array(w2 + 1).fill(0))
    for (let i = 0; i <= w1; i++){
        dp[i][0] = i
    }
    for (let j = 0; j <= w2; j++){
        dp[0][j] = j
    }
    for (let i = 1; i <= w1; i++){
        for (let j = 1; j <= w2; j++){
            if (word1[i - 1] === word2[j - 1]) {
                dp[i][j] = dp[i-1][j-1]
            } else {
                dp[i][j] = Math.min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1
            }
        }
    }
    return dp[w1][w2]
};

🎯题目总结

if (word1[i - 1] != word2[j - 1])时
1、操作一:word1删除一个元素,那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作。即 dp[i][j] = dp[i - 1][j] + 1;
2、操作二:word2删除一个元素,那么就是以下标i - 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上一个操作。即 dp[i][j] = dp[i][j - 1] + 1;
注意:word2添加一个元素,相当于word1删除一个元素,例如 word1 = “ad” ,word2 = “a”,word1删除元素’d’ 和 word2添加一个元素’d’,变成word1=“a”, word2=“ad”, 最终的操作数是一样!
3、操作三:替换元素,word1替换word1[i - 1],使其与word2[j - 1]相同,此时不用增删加元素。if (word1[i - 1] == word2[j - 1])的时候我们的操作 是 dp[i][j] = dp[i - 1][j - 1] 对吧。那么只需要一次替换的操作,就可以让 word1[i - 1] 和 word2[j - 1] 相同。所以 dp[i][j] = dp[i - 1][j - 1] + 1;
综上,当 if (word1[i - 1] != word2[j - 1]) 时取最小的,即:dp[i][j] = min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;

🎈今日心得

编辑距离的题目终于达到了最难的一题,确实难

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

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

相关文章

知识分享:如何制作一个电子名片二维码?

参加国际展会、寻找合作商、线下客户拜访、渠道开发、商务对接、行业交流大会……在这些场合中&#xff0c;商务名片都是必不可少的。随着二维码应用的流行&#xff0c;名片上使用二维码已经非常普遍了。你也可以在商务名片上使用一个自己设计的电子名片二维码&#xff0c;扫描…

基于 KubeSphere 部署 KubeBlocks 实现数据库自由

作者&#xff1a;尹珉&#xff0c; KubeSphere Contributor & Ambassador&#xff0c;KubeSphere 社区用户委员会杭州站站长。 KubeSphere 是什么&#xff1f; KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统&#xff0c;完全开源&#xff0c;支持…

使用HTML制作一个摊煎饼小游戏

铁打的行业流水的人&#xff0c;与其被动等待35岁的到来&#xff0c;不如主动出击探索副业&#xff0c;实现一个HTML摊煎饼小游戏&#xff0c;结合传统方法和现代技术&#xff0c;致力于制作出既美味又有创意的煎饼。 目录 引言简介游戏背景 所需材料和工具HTML基础知识CSS样式…

python作图

最重要的一张图了&#xff0c;有助于了解一下图的各个组成部分。最重要的一句话就是 Figure包含至少一个Axes&#xff0c;每个Axes可以被认为是一个模块&#xff08;包含坐标轴&#xff0c;标题&#xff0c;图像内容等&#xff09;。因此&#xff0c;创建单图的时候就是在Figur…

BAT028:批量将文件修改日期后缀更新为最新修改日期

引言&#xff1a;编写批处理程序&#xff0c;实现批量将文件修改日期后缀更新为最新修改日期。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【…

文本识别工具 TextSniper for Mac有哪些特点

TextSniper 是一款 macOS 平台上的文本提取工具&#xff0c;它可以将屏幕上的文字内容快速转换为可编辑的文本。无论是从图像、视频、PDF 文件还是其他类型的文档中提取文字&#xff0c;TextSniper 都提供了便捷的功能。 以下是 TextSniper的一些主要特点和功能&#xff1a; …

智慧粮仓粮库解决方案:视频+AI识别技术赋能,守护大国粮仓

一、需求背景 我国作为世界人口大国&#xff0c;农产品需求量庞大&#xff0c;保障粮食等重要农产品安全是经济社会稳定发展的重要基础。粮食安全涉及到生产、收购、加工、储藏、销售等全产业链&#xff0c;既涉及新型基础设施建设&#xff0c;也有对软件技术等专业能力要求。…

我的128创作纪念日

我的创作128纪念日 &#x1f388;1.机缘&#x1f388;2.收获&#x1f388;3.反思与憧憬 &#x1f388;1.机缘 2023年6月13日的那天&#xff0c;开始了CSDN的创作之旅&#xff0c;那时的我还是一名大一的学生&#xff0c;机缘巧合下开始了创作&#xff0c;主要也是分享自己在学习…

Apache Doris (四十二): RECOVER数据删除恢复

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

web前端面试-- IEEE754标准JS精度丢失问题0.1+0.2!=0.3、0.2+0.3==0.5 十进制转二进制讲解

本人是一个web前端开发工程师&#xff0c;主要是vue框架&#xff0c;整理了一些面试题&#xff0c;今后也会一直更新&#xff0c;有好题目的同学欢迎评论区分享 ;-&#xff09; web面试题专栏&#xff1a;点击此处 背景 WEB前端面试官&#xff1a;0.20.3是否等于0.5&#xff…

文心一言 VS 讯飞星火 VS chatgpt (116)-- 算法导论10.3 1题

一、用go语言&#xff0c;画图表示序列(13&#xff0c;4&#xff0c;8&#xff0c;19&#xff0c;5&#xff0c;11)&#xff0c;其存储形式为多数组表示的双向链表。同样画出单数组表示的形式。 文心一言&#xff1a; 在Go语言中&#xff0c;我们无法直接画图&#xff0c;但我…

用Python造轮子

目录 背景安装setuptools库准备要打包的代码创建setup.py文件打包生成whl文件把库装到电脑上使用这个库 背景 如何把自己写的代码&#xff0c;打包成库方便其他人使用 安装setuptools库 正所谓想要富先修路&#xff0c;先把造轮子要用的库装上 pip install wheel pip insta…

C# Socket通信从入门到精通(1)——单个同步TCP客户端C#代码实现

前言: Socket通信中有tcp通信,并且tcp有客户端和服务器,本文介绍的就是如何使用c#去实现一个tcp客户端,并且由于c#中有多种方式可以实现tcp客户端的功能,本文介绍的是使用TcpClient类来实现tcp客户端功能(如需源码,订阅专栏后加入文章底部qq群获取),demo软件界面如下…

供应链 | 零售商-供应商柔性承诺契约:一种鲁棒优化方法 (二)

原文作者&#xff1a;Aharon Ben-Tal, Boaz Golany, Arkadi Nemirovski, Jean-Philippe Vial​ 引用&#xff1a;Ben-Tal, A., Golany, B. , Nemirovski, A., & Vial, J. P… (2005). Retailer-supplier flexible commitments contracts: a robust optimization approach. …

View 自定义 - 概览

一、体系 详见&#xff1a;Activity、Window、DecorView、ViewRoot 之间的关系 二、绘制前的准备 DecorView 详见&#xff1a;DecorView 顶部图中可以看出 ViewRoot 最后一步是绘制&#xff0c;在绘制之前系统会有一些准备&#xff0c;即前面几个步骤&#xff1a;创建PhoneW…

D/A变换器隔离变送器PWM信号转模拟量1Hz~10KHz转0-5V/0-10V/4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

绝地求生游戏缺少msvcp140.dll丢失打不开怎么办?这6个方法都能修复

计算机系统中&#xff0c;我们经常遇到各种错误和问题。其中&#xff0c;“MSCVCP140.DLL丢失”是一个常见的错误&#xff0c;它通常出现在运行某些程序或游戏时。这个DLL文件是Microsoft Visual C 2015 Redistributable的一部分&#xff0c;如果它丢失或损坏&#xff0c;可能会…

Spring Boot 可以同时处理多少请求?

文章目录 Spring Boot 的请求处理能力1. 硬件资源2. 应用程序的设计3. 配置4. 运行时环境 基准测试和性能优化高性能的 Spring Boot 应用程序示例结论 &#x1f389;欢迎来到架构设计专栏~Spring Boot 可以同时处理多少请求&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#…

凝聚技术力量 共建测试生态 ——集成电路测试技术交流日成功举办

10月18日下午&#xff0c;凝聚技术力量&#xff0c;共建测试生态 ——集成电路测试技术交流会在上海成功举办。来自全国各地知名专家学者、技术大咖及企业代表齐聚一堂&#xff0c;共同探讨封装测试技术的发展方向&#xff0c;共话产业未来&#xff0c;共促产业发展。 本次活动…

Web前端—盒子模型:选择器、PxCook、盒子模型、正则表达式、综合案例(产品卡片与新闻列表)

版本说明 当前版本号[20231019]。 版本修改说明20231018初版20231019补充了综合案例二新闻列表的代码及完善部分代码 目录 文章目录 版本说明目录盒子模型01-选择器结构伪类选择器基本使用:nth-child(公式)伪元素选择器 02-PxCook03-盒子模型盒子模型-组成边框线四个方向单方…