数据结构与算法|算法总结|动态规划之编辑距离总结篇

news2025/1/18 20:24:50

啥也不说先上图!

在这里插入图片描述

本节一共总结了六道题,个人认为作为二维dp的典型用法,所以归纳到了一起,方便对比、类比学习。

718.最长重复子序列

力扣题目链接
文章链接
两个整数数组A、B,返回两个数组中 公共的、长度最长的子数组的长度。

从题目我们可以看出,本题将来和后面最大的不一样就是要求公共的子数组。其实就是要求中间是不能断开的。所以这就决定了我们遇到当前元素不想等时,我们直接不管,然后就是需要一个result来实时存储当前的最大公共子数组的长度。

dp[i][j] :以下标i - 1为结尾的num1,和以下标j - 1为结尾的num2,最长重复子数组长度为dp[i][j]
为什么要定义成i-1结尾和以j-1结尾呢?就是为了让初始化比较方便,在后续的子序列的二维dp中,都是采用这样的形式

递推公式:
dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。

  • if (nums[i - 1] == nums2[j - 1])
    • 让最长重复子数组+1
    • 用result保存当前结果
  • if(nums[i - 1] != nums2[j - 1])
    • 直接不管!

即当nums[i - 1]nums2[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1

根据递推公式可以看出,遍历i 和 j 要从1开始!

if (nums1[i - 1] == nums2[j - 1]) {
    dp[i][j] = dp[i - 1][j - 1] + 1;

1143.最长公共子序列

力扣题目链接
文章链接
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。
本题跟上面那道【718.最长重复子序列】只不过是不要求是连续起来的。
既然不要求连续,我们这里可以想象我们需要做删除操作(编辑距离思路)

dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]

  • if (test[i - 1] == text2[j - 1]
    • 我们还是记录最长公共子序列 + 1
  • if (test[i - 1] != text2[j - 1]
    • 当前的不匹配?那就只能考虑text1的前一个或者考虑text2的前一个了,取一个最大的!
    • 不同时,说明当前字符不能同时出现在最长公共子序列中,因此最长公共子序列的长度取决于去掉text1的最后一个字符和去掉text2的最后一个字符后的两个子问题,即 dp[i - 1][j] 和 dp[i][j - 1] 的最大值。
    • 本质上就是把之前可能相等的信息继承过来

状态转移公式:

if (test[i - 1] == text2[j - 1] {
	dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
	dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}

45.不相交的线

真正做到了跟1143最长公共子序列一模一样
力扣题目链接
文章链接

392.判断子序列

力扣题目链接
文章链接
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

本题其实最合适的算法是双指针和贪心。但是它太适合用来做编辑距离的开篇了。

这里重点讲解它的dp数组和递推公式的推导:

dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。如果我们到时候记录到

这里为什么要定义成下标i-1为结尾和以下标j-1为结尾呢?因为如果以i、j结尾,会让初始化的写法非常麻烦

递推公式:

  1. if (s[i - 1] == t[j - 1])
    • t中找到了一个字符在s中也出现了,相同子序列长度+1
  2. if (s[i - 1] != t[j - 1])
    • 相当于t要删除元素,继续匹配。那就直接继承t的前一个元素信息喽
if (s[i - 1] == t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
else dp[i][j] = dp[i][j - 1];

115.不同的子序列

力扣题目链接
文章链接
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。

这里我们当然要把dp数组定义成个数
dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]

当s[i - 1] 与 t[j - 1]相等时,dp[i][j]也就是说子序列出现的个数可以有两部分组成。

  • 用s[i - 1]来匹配 ,个数为dp[i - 1][j - 1]
  • 不用s[i - 1]来匹配,个数为dp[i - 1][j]
    所以说这里千万不要有什么+1 -1的操作,我们的是否用s[i-1]来匹配就已经包含了出现个数的操作

如果不想等的话,dp[i][j]只有一个部分组成,不用s[i - 1]来匹配,也就是dp[i][j]=dp[i-1][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];
}

583.两个字符的删除操作

力扣题目链接
文章链接
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最少步数,每步可以删除任意一个字符串中的一个字符。

现在已经是编辑距离直接不装了,明示删除操作使得word1和word2相同。

dp设定的思路还是不变:
dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数

如果相同:直接dp[i][j]=dp[i-1][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。

这里有一个小trick:
dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2。因为其实dp[i][j-1]已经不靠里word2的j-1个字符了,在此基础上,如果再删除woed1的第 i -1个字符,实际就相当于达到了同时删除两个字符的效果,也就是操作数+1,即dp[i][j-1] + 1。

状态转移方程:

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] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});
    //dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
}

72.编辑距离

力扣题目链接
文章链接
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

已经是一模一眼里就是操作变多了。

编辑距离我们可以增、删、换

dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]

if (word1[i - 1] == word2[j - 1])
    不操作
if (word1[i - 1] != word2[j - 1])
    增
    删
    换
  1. 不操作
    两个对应元素想等的时候直接不操作,继承前面的
    dp[i][j] = dp[i - 1][j - 1]

word1增加一个元素,使其word1[i - 1]与word2[j - 1]相同,那么就是以下标i-2为结尾的word1 与 i-1为结尾的word2的最近编辑距离 加上一个增加元素的操作。

即 dp[i][j] = dp[i - 1][j] + 1;

word2添加一个元素,使其word1[i - 1]与word2[j - 1]相同,那么就是以下标i-1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 加上一个增加元素的操作。

即 dp[i][j] = dp[i][j - 1] + 1;

3. 删
word2添加一个元素,相当于word1删除一个元素,例如 word1 = “ad” ,word2 = “a”,word2添加一个元素d,也就是相当于word1删除一个元素d,操作数是一样!

替换元素,word1替换word1[i - 1],使其与word2[j - 1]相同,此时不用增加元素,那么以下标i-2为结尾的word1 与 j-2为结尾的word2的最近编辑距离 加上一个替换元素的操作。

即 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;

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 - 1][j], dp[i][j - 1]}) + 1;
}

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

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

相关文章

跨域数据流动:数据提取过程中的治理与安全双轮驱动

跨域数据流动:数据提取过程中的治理与安全双轮驱动 随着信息技术的飞速发展,跨域数据流动已成为现代社会的常态。从医疗记录到金融交易,从社交媒体到企业运营,数据在各个领域之间频繁交换,为社会发展带来了极大的便利…

Cocktail for Mac 激活版:一站式系统优化与管理神器

Cocktail for Mac是一款专为Mac用户打造的系统优化与管理工具,凭借其强大的功能和简便的操作,赢得了广大用户的喜爱。这款软件集系统清理、修复和优化于一身,能够帮助用户轻松解决Mac系统中的各种问题,提高系统性能。 Cocktail fo…

MySQL单表查询案例演示

目录 一、创建数据库lianxi 二、选择数据库为lianxi 三、新建一个数据表grade,在grade表中插入数据 四、开始进行查询操作(验证表中数据) 1、查询1945班的成绩信息 2、查询1945班,语文成绩大于60小于90的成绩信息 3、查询学…

电商数据分析的介绍及应用||电商数据API接口

在这到处弥漫着电商气息的社会里,人们依靠电商让生活变得简单而便捷。那么作为电商数据分析师,我们需要在海量电商数据中揭示出隐含的、先前未知的并有潜在价值的信息和规律,这也要求我们具备数据洞察和汇总能力,运用数据挖掘模型…

Leetcode-有效的括号(带图)

20. 有效的括号 - 力扣(LeetCode)https://leetcode.cn/problems/valid-parentheses/ 题目 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足&…

git 拉取指定目录

指令方式 打开 git 自带的Git Bash 工具 以拉取github中 fastjson 的 /src/test/java/oracle/sql/ 目录为例 1.创建文件夹和git 初始化 cd D:/Program\ Files mkdir fastjson cd fastjson git init 2.设置允许克隆子目录 git config core.sparsecheckout true 3.添加远程…

【physx/wasm】在physx中添加自定义接口并重新编译wasm

目录 说在前面环境搭建编译自定义接口 说在前面 操作系统:windows11wsl2physx版本:5.3.1参考:physx-js-webidl (physx版本为该作者fork出的某个版本) 环境搭建 这里使用的是wsl2docker进行编译的,搭建步骤参考:WSL2 上…

深入探索Jetpack Compose:大前端式客户端开发实战

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉注册地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

win10编译openssl

环境 Win10 64位 VS2022 openssl 3.3.0 nasm NASM version 2.16.01 compiled on Dec 21 2022 perl strawberry-5.38.2.2环境变量设置 perl加入到环境变量,略过nasm加入到环境变量vs的nmake加入到环境变量我的nmake位置如下: C:\Program…

【Unity Shader入门精要 第7章】基础纹理(二)

除了用于直接表示物体表面颜色,纹理的另外一种常见用法是用来进行凹凸映射,在不增加顶点的情况下,通过纹理来提供额外的法线信息,从而在视觉上增加表面凹凸细节,丰富渲染表现。 最常用的两种凹凸映射为法线贴图和高度…

【C语言每日题解】用函数来模拟实现strlen()、strcpy()、strcmp()、strcat()

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 学习了函数后,老师让我们用函数来实现上面这四个字符串函数。 我们首先来了解一下这四个字符串函数: 1.strlen函数 用于获取字符串长度(不包括末尾…

用Rust构造一个人员基本信息的实体类,输出json测试结果

目录 一、需求说明 二、知识点 serde 一、需求说明 需求描述:用Rust写一个人员基本信息的实体类, 包括编号、姓名、描述、性别、备注、照片、简历等,加上3条测试数据,输出为json。 cargo add serde serde { version "1.0.201"…

SVN切换账号

SVN切换账号 有这么一种情况,对于一个新项目,项目紧急的情况下,大家会使用一个svn账号下载代码,开始提前熟悉业务。那么当正式开发的时候,每个人的svn账号也已经下发下来了,这个时候大家就需要切换成自己的…

Jquery+Servlet+JDBC实现登录注册功能

前端部分 HTMLCSS部分 引入JQuery包和JQuery.cookie包,前者封装了DOM操作的一些方法,后者封装了对cookie的操作 我们使用cookie主要是为了做登录后页面的跳转时,能存下来这个用户是谁,这样后面可以对单一用户进行操作&#xff…

嵌入式学习-PWM输出比较

简介 PWM技术 输出比较框图介绍 定时器部分 比较器控制部分 输出控制部分 相关寄存器

使用screen窗口在Autodl服务器训练网络

无法使用鼠标滚轮来查看历史输出的消息 vim ~/.screenrc 按i插入 termcapinfo xterm* ti:te 按esc :wq 保存screen创建的会话中,无法使用鼠标滚轮来查看历史输出的消息 解决方法_screen查看历史输出-CSDN博客无法使用鼠标滚轮查看screen会话历史,解决方…

证件照尺寸标准大小及用途介绍

在日常生活中,证件照是我们不可或缺的一部分,无论是办理身份证、驾驶证,还是参加考试、求职,都需要用到不同尺寸和底色的证件照。本文将为您详细介绍证件照的尺寸标准、用途以及底色的选择。 一、证件照的尺寸标准证件照的尺寸通…

【错题集-编程题】小红的ABC(字符串 + 找规律)

牛客对应题目链接:小红的ABC (nowcoder.com) 一、分析题目 算法思路:由于题目要找的是最短的回文子串,并且只有三个字母:a、b、c,因此最短的回文子串的长度要么是 2,要么是 3。因此,我们仅需枚举…

如何重启Windows系统上的Mysql服务

很久很久之前,我想把我的一台windows笔记本当比服务使用,当时还没有搞wsl, 试了vmware在局域网内总是断连。然后就直接在 windows系统上装了一个 windows版本的Mysql81。 有一天需要修改最大连接数, 费了挺大的劲终于找到了配置文件 my.ini…

“碳”索不止

2023年,欧盟宣布将在未来实施CBAM(碳边境调节机制),也称为碳关税,是一种针对进口货物的碳排放定价政策工具。该机制要求在欧盟境内的进口商对其进口产品支付相应的碳排放费用,以弥补其生产过程中产生的碳排…