第五十五天| 583. 两个字符串的删除操作、72. 编辑距离

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

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

题干:给定两个单词 word1 和 word2 ,返回使得 word1 和  word2 相同所需的最小步数

每步 可以删除任意一个字符串中的一个字符。

思考:动态规划。本题中的步数可以看作删除字母,使得两单词最终处理为相同字母组。

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

dp[i][j]:使得 以i - 1结尾的单词word1和以j - 1结尾的单词word2 相同所需的最小步数。

  • 确定递推公式

从dp[i][j]的定义可以看出,字母比较就两种情况

  • 当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

当然要取最小值,所以当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);

  • dp数组如何初始化

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

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

  • 确定遍历顺序

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

所以遍历的时候一定是从上到下,从左到右,这样保证dp[i][j]可以根据之前计算出来的数值进行计算。

  • 举例推导dp数组

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

代码:

class Solution {
public:int minDistance(string word1, string word2) {//dp[i][j]:使得 以i - 1结尾的单词word1和以j - 1结尾的单词word2 相同所需的最小步数 vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));for (int i = 1; i <= word1.size(); i++)     //单词word2为空的情况dp[i][0] = i;for (int j = 1; j <= word2.size(); j++)     //单词word1为空的情况dp[0][j] = j;for (int i = 1; i <= word1.size(); i++) {           //遍历单词word1for(int j = 1; j <= word2.size(); j++) {        //遍历单词word2if (word1[i - 1] == word2[j - 1])dp[i][j] = dp[i - 1][j - 1];        //字母相同则无需无需删除字母elsedp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + 1;     //字母不相同则选一单词删除字母,取最小值}}return dp[word1.size()][word2.size()];}
};

思考:动态规划。本题也可以从求公共子序列入手,要删除的元素个数(即步数)为两单词长度减去两倍公共子序列长度。具体如何求公共子序列:1143 最长公共子序列

代码: 

class Solution {
public:int minDistance(string word1, string word2) {//dp[i][j]:单词word1的处理区间[0, i - 1]与单词word2的处理区间[0, j - 1]中,存在的最长公共子序列的长度vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));     for (int i = 1; i <= word1.size(); i++) {           //遍历单词word1for (int j = 1; j <= word2.size(); j++) {       //遍历单词word2if (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() - 2 * dp[word1.size()][word2.size()];        //两单词去除最长公共子序列}
};

Leetcode 72. 编辑距离

题目链接:72 编辑距离

题干:给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

思考:动态规划。本题要先想清楚:真正要求的是将word1和word2变成相同单词的操作次数。

题干中删除word1字母的操作 可以等价为 插入word2字母的操作;插入word1字母的操作 可以等价为 删除word2字母的操作。下面就直接考虑删除操作不考虑插入操作。

因此本题与上题的区别在 确定递推公式中:

当word1[i - 1] 与 word2[j - 1]不相同的时候,有不同的三种操作:

情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1

情况二:删word2[j - 1](同向word1中插入),最少操作次数为dp[i][j - 1] + 1

情况三:替换word1[i - 1],最少的操作次数为dp[i - 1][j - 1] + 1

当然要取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 1, dp[i - 1][j] + 1, dp[i][j - 1] + 1});

代码:

class Solution {
public:int minDistance(string word1, string word2) {//dp[i][j]:对以i- 1结尾的单词word1和以j - 1结尾的单词word2操作,让处理后两单词相同的最少操作次数vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));for (int i = 0; i <= word1.size(); i++)     //单词word2为空的情况dp[i][0] = i;for (int j = 1; j <= word2.size(); j++)     //单词word1为空的情况dp[0][j] = j;for (int i = 1; i <= word1.size(); i++) {           //遍历单词word1for (int j = 1; j <= word2.size(); j++) {       //遍历单词word2if (word1[i - 1] == word2[j - 1])//当前两字母相同则不用处理dp[i][j] = dp[i - 1][j - 1];    else//当前两字母不同则考虑替换word1的字母,删除word1的字母以及删除word2的字母dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j -1])) + 1;}}return dp[word1.size()][word2.size()];}
};

自我总结:

        理解公共子序列问题的关键在于删除操作,两字符串的操作含义同dp数组的含义变化而变化。动态规划是在每次操作中考虑每种情况,统一处理。

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

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

相关文章

太酷辣!程序员的技术测评利器免费用!

最近市场行情众所周知的差&#xff0c;追求降本增效已经是企业常态&#xff0c;企业希望不花太多成本就能快速招到“好用”的人才。这对计划招人的技术 Leader 来说也是不小的挑战&#xff1a; 招聘过程要低成本&#xff0c;还要快&#xff0c;而且能精准识别合适的人才&#…

单例模式( Singleton)——创建型模式

单例模式——创建型模式 什么是单例模式&#xff1f; 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。简单来说如果你创建了一个对象&#xff0c; 过一会儿后你决定再创建一个新对象&#xff0c; 此…

【LeetCode热题100】206. 反转链表(链表)

一.题目要求 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2…

ECCV2022 | BEVFormer原文翻译

BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers BEVFormer: 通过时空变换器从多摄像头图像中学习鸟瞰图表征 Figure 1: We propose BEVFormer, a paradigm for autonomous driving that applies both Trans…

【alibaba funAsr-0.1.9实时语音转文字部署(内外网】

alibaba funAsr-0.1.9实时语音转文字部署&#xff08;内外网&#xff09; 官方参考文档&#xff1a; https://github.com/alibaba-damo-academy/FunASR/blob/main/runtime/docs/SDK_advanced_guide_online_zh.md 前提&#xff1a; 我的内网服务器是华为欧拉&#xff0c;arm…

halcon绘制图形

1、ROI是Halcon中的一个很重要的概念&#xff0c;为了减少计算量&#xff0c;只关注待检测物体或该物体周围的一片区域即可(类似于图片裁剪) * ROI是Halcon中的一个很重要的概念&#xff0c;为了减少计算量&#xff0c;只关注待检测物体或该物体周围的一片区域即可&#xff0c…

指针的函数传参的详细讲解(超详细)

如果对指针基础知识已经有可以直接跳到 函数的指针传参与解引用&#xff0c;哪里不明白可以评论&#xff0c;随时解答。 目录 所以就有了一句话&#xff1a;指针就是地址&#xff0c;地址就是指针 对于指针在C语言中&#xff0c;指针类型就是数据类型&#xff0c;是给编译器…

【Flask开发实战】项目介绍-防火墙规则查询系统

一、前言 硬件防火墙为常备主用网络安全设备&#xff0c;主要通过网络访问控制方式实现安全防护。 不同厂家防火墙的网络访问控制功能均采用同样的模式操作&#xff1a;防火墙配置若干条防火墙规则&#xff0c;当IP包到来&#xff0c;防火墙根据包的五元组属性&#xff08;协…

大模型的实践应用18-大模型的开发框架LangChain的简单应用与Faiss向量数据库实现

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用18-大模型的开发框架LangChain的简单应用与Faiss向量数据库实现。LangChain是一个强大的开发框架,专门用于构建基于大型语言模型(LLM)的应用程序。它提供了丰富的工具和组件,帮助开发者更轻松地利用LLM的能力。下面…

汇编语言程序设计 第3章:汇编语言程序格式

文章目录 1. 伪指令1.1 段定义伪指令1.2 段寄存器说明伪指令1.3 过程定义伪指令1.4 源程序结束伪指令 2. 变量/标号定义伪指令2.1 变量定义2. 2 标号定义2.3 表达式 3.地址计数器与对准伪指令3.1 地址计数器$3.2 对准伪指令 4. DOS功能调用4.1 DOS功能调用的一般方法4.2 常用的…

汽车电子零部件(1):综述

汽车零部件有哪些? 这里有一份汽车零部件清单,它们是汽车制造的部件,包括油车和电车;并不详尽。这些零件中的许多(并非全部)也用于卡车和公共汽车等其他机动车辆。 <

Sublime查看ANSI编码文档乱码问题

原因为没有安装对应的解码插件。 选择安装插件包 选择插件包&#xff1a;ConvertToUTF8或者GBK&#xff0c;我试了第一个插件包不行&#xff0c;安装GBK插件包后OK。