代码随想录算法训练营第五十六天 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结

news2024/11/25 14:37:21

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

动规五部曲

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

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

2、确定递推公式

当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

当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式: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

3、dp数组如何初始化

从递推公式中,可以看出来,dp[i][0] 和 dp[0][j]是一定要初始化的。

dp[i][0]:word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同呢,很明显dp[i][0] = i。

4、确定遍历顺序

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

5、举例推导dp数组

以word1:"sea",word2:"eat"为例,推导dp数组状态图如下:

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

思路二

只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
        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] + 1;
                } else {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return word1.size() + word2.size() - dp[word1.size()][word2.size()] * 2;
    }
};

72. 编辑距离

动规五部曲

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

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

2、确定递推公式

在确定递推公式的时候,首先要考虑清楚编辑的几种操作,整理如下:

if (word1[i - 1] == word2[j - 1])
    不操作
if (word1[i - 1] != word2[j - 1])
    增
    删
    换

if (word1[i - 1] == word2[j - 1]) 那么说明不用任何编辑,dp[i][j] 就应该是 dp[i - 1][j - 1],即dp[i][j] = dp[i - 1][j - 1];

if (word1[i - 1] != word2[j - 1])

  • 操作一:word1删除一个元素,那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作。

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

  • 操作二: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"

操作三:替换元素,word1替换word1[i - 1],使其与word2[j - 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;

3、dp数组如何初始化

dp[i][0] :以下标i-1为结尾的字符串word1,和空字符串word2,最近编辑距离为dp[i][0]。

那么dp[i][0]就应该是i,对word1里的元素全部做删除操作,即:dp[i][0] = i;

同理dp[0][j] = j;

4、确定遍历顺序

从如下四个递推公式:

  • dp[i][j] = dp[i - 1][j - 1]
  • dp[i][j] = dp[i - 1][j - 1] + 1
  • dp[i][j] = dp[i][j - 1] + 1
  • dp[i][j] = dp[i - 1][j] + 1

可以看出dp[i][j]是依赖左方,上方和左上方元素的,如图:

所以在dp矩阵中一定是从左到右从上到下去遍历。

 5、举例推导dp数组

以示例1为例,输入:word1 = "horse", word2 = "ros"为例,dp矩阵状态图如下:

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

 

编辑距离总结

编辑距离从判断子序列->判断子序列 ->不同的子序列 ->两个字符串的删除操作->编辑距离

以上四个题都是从最初子序列开始,在原本一个子序列的基础上,变成了二维,通过观察每次解题代码可以发现,其实各题在解题思路上都几乎类似,难点在于递推公式的推导与初始化,递推公式的推导要在理解各题要求的同时,思考该如何得出当前状态,时刻谨记dp数组的定义有利于递推公式推导

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

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

相关文章

基于matlab使用Swerling目标模型来描述雷达横截面的波动

一、前言该示例说明了如何使用Swerling目标模型来描述雷达横截面的波动。该场景由旋转单基地雷达和具有Swerling 2模型描述的雷达横截面的目标组成。在此示例中&#xff0c;雷达和目标是静止的。二、斯威林 1 与斯威林 2 模型在Swerling 1和Swerling 2目标模型中&#xff0c;总…

Spring项目中如何接入Open AI?

前言 最近随着ChatGPT的爆火&#xff0c;很多人都坐不住了&#xff0c;OpenAI API 允许开发人员访问该模型并在其自己的应用程序中使用。那么它能给我们我们Java开发带来那些好处呢&#xff1f;又该怎么接入Open AI呢&#xff1f; 在开始之前&#xff0c;我们需要在 OpenAI 网…

安全沙箱技术小科普

安全沙箱技术是一种用于保护用户隐私和系统安全的机制&#xff0c;它可以将应用程序限制在一个封闭的运行环境中&#xff0c;防止其对系统和其他应用程序造成潜在的威胁。安全沙箱技术广泛应用于计算机安全领域&#xff0c;如防病毒软件、浏览器、操作系统等&#xff0c;以提高…

UE4读取本地XML文件

关键词&#xff1a;UE4 UE5 Unreal Engine XML 文件 txt 需求&#xff1a; 游戏开发中需要读取了写入配置文件&#xff0c;需要保存场景信息&#xff0c;道具位置旋转信息&#xff0c;那么将其保存为XML是一个不错的办法。 涉及知识点&#xff1a; 怎样读取xml文件 思路 …

2023级浙江大学MBA提前批面试真题及经验分享

前段时间获得了浙大MBA项目拟录取资格&#xff0c;在跟易考周老师报喜的同时也很荣幸收到了分享提前批面试经验的邀请&#xff0c;现在也4月中旬了&#xff0c;马上浙大MBA提面第一批次就要开始了&#xff0c;根据我的经验来说&#xff0c;参加浙大前三批提面拿优秀的概率会更高…

移动App测试实战—专项测试

移动App测试实战—专项测试 我们在进行了手工的功能测试之后&#xff0c;也开发了一些自动化测试用例&#xff0c;并且做了性能测试之后&#xff0c;测试工作看似比较完整了。但是当我们的App在大量的用户那里被安装和使用的时候&#xff0c;还是会有很多我们之前没有预料的问题…

【C++】STL——用一颗红黑树封装出map和set

用一颗红黑树封装出map和set 文章目录用一颗红黑树封装出map和set一、前言二、红黑树模板参数的控制三、模板参数中仿函数的增加四、红黑树正向迭代器的实现五、红黑树的反向迭代器的实现六、红黑树的begin()和end()七、红黑树的rbegin()和rend()八、[ ]下标访问运算符重载九、…

java ssm人力资源系统Y3程序

1&#xff0e;系统登录&#xff1a;系统登录是员工访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括员工名、密码和验证码&#xff0c;然后对登录进来的员工判断身份信息&#xff0c;判断是管理员还是普通员工。 2&#xff0e;系统员工管理&#xff1a;不管是超级…

深入剖析:如何优化Android应用的性能和内存管理

深入剖析&#xff1a;如何优化Android应用的性能和内存管理 性能和内存管理的重要性 在今天的移动应用开发中&#xff0c;用户对于应用的性能和体验要求越来越高。一款性能卓越的Android应用能够提供流畅的操作体验、快速的响应速度以及较低的资源消耗&#xff0c;从而提高用户…

26《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享

​《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限&#xff0c;如果错误欢迎批评指正。 第六章&#xff1a;The principles of protein folding kinetics &#xff08;蛋白质折叠动力学的原理&#xff09; -速率测量有助于深入了解蛋白…

高级数据结构与算法 | 基数树(Radix Tree)

文章目录RadixTree基本概念概念Radix Tree VS Trie Tree应用场景实现数据结构插入删除查找完整代码RadixTree 基本概念 概念 如果对 Trie 不太了解&#xff0c;可以看看我的往期博客&#xff1a; https://oreki.blog.csdn.net/article/details/109076473 Radix Tree是一种基于…

[HNCTF 2022 Week1]Challenge__rce

1.打开环境。 查看源码传入hint获得源码。 <?php error_reporting(0); if (isset($_GET[hint])) {highlight_file(__FILE__); } if (isset($_POST[rce])) {$rce $_POST[rce];if (strlen($rce) < 120) {if (is_string($rce)) {if (!preg_match("/[!#%^&*:\-&…

采集工具如何帮助SEO优化关键词

随着互联网的发展&#xff0c;越来越多的企业开始意识到SEO优化对于企业的重要性。SEO优化可以帮助企业提高网站在搜索引擎中的排名&#xff0c;进而吸引更多的潜在客户。而关键词则是SEO优化的核心&#xff0c;如何找到合适的关键词&#xff0c;成为了企业优化的关键。在这里&…

ActiveMQ使用(三):在JavaScript中使用mqttws31.js

ActiveMQ使用(三):在JavaScript中使用mqttws31.js 1. 环境准备 jQuery-1.10 下载地址:https://www.jsdelivr.com/package/npm/jquery-1.10.2?tabfilesmqttws31.js: 下载地址:https://www.jsdelivr.com/package/npm/ng2-mqtt 2. 相关代码 <!DOCTYPE html> <html …

【GPT4】微软 GPT-4 测试报告(3)GPT4 的编程能力

欢迎关注【youcans的GPT学习笔记】原创作品&#xff0c;火热更新中 微软 GPT-4 测试报告&#xff08;1&#xff09;总体介绍 微软 GPT-4 测试报告&#xff08;2&#xff09;多模态与跨学科能力 微软 GPT-4 测试报告&#xff08;3&#xff09;GPT4 的编程能力 【GPT4】微软 GPT-…

在线绘制思维导图

思维导图是一种可视化的思维工具&#xff0c;它可以将放射性思考具体化为可视的图像和图表。 思维导图利用图文并重的技巧&#xff0c;把各级主题的关系用相互隶属与相关的层级图表现出来&#xff0c;把主题关键词与图像、颜色等建立记忆链接。 它运用图像和颜色等多种元素&…

ctf做题记录本

2023年3月16日 1.XXE漏洞 没做出来&#xff0c;bp上怎么不显示结果 https://blog.csdn.net/weixin_43553654/article/details/107760067?spm1001.2101.3001.6650.5&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EESLANDING%7Edefault-5-107760067-blo…

Java线上监控诊断产品Arthas

最近一直在研究Java的动态追踪技术&#xff0c;碰到了Arthas&#xff0c;正好以前也想学&#xff0c;趁此机会就了解了一下。 什么是Arthas&#xff1f;首先我们看看Arthas官方文档是怎么描述的&#xff1a; 什么是Arthas Arthas 是一款线上监控诊断产品&#xff0c;通过全局…

欧拉函数及其线性筛

一&#xff0c;定义 欧拉函数是对于n小于或者等于他的数中与n互质的数的个数。一般用φ(x)表示。 二&#xff0c;欧拉函数公式 其中pi为n的所有质因数。 公式的理解方法可以是pi是与n互质的数&#xff0c;那么它&#xff08;包括它的倍数&#xff09;在1~n里面是均匀出现的&…

分布式场景下,Apache YARN、Google Kubernetes 如何解决资源管理问题?

所有的资源管理系统都需要解决资源的有效利用、任务的有效响应、调度策略的灵活配置这三个最基本问题。那么在分布式的场景下&#xff0c;YARN和Kubernetes是怎么解决的呢&#xff1f;本篇进行介绍。 — Apache YARN — YARN全称为&#xff08;Yet Another Resource Negotiato…