代码随想录Day56|583.两个字符串的删除操作 、72.编辑距离、编辑距离总结篇
创始人
2024-04-27 22:54:25
0

文章目录

  • 583.两个字符串的删除操作
  • 72.编辑距离
  • 编辑距离总结篇

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

文章讲解:代码随想录 (programmercarl.com)

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

题目:

给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

分析:

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

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

  2. 确定递推公式

    • 当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});

  3. dp数组如何初始化

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

    dp[0] [j]的话同理

  4. 确定遍历顺序

    所以遍历的时候一定是从上到下,从左到右

  5. 举例推导dp数组

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

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

72.编辑距离

文章讲解:代码随想录 (programmercarl.com)

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

题目:

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

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

分析:

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

    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;
    • 操作三:替换元素,word1替换word1[i - 1],使其与word2[j - 1]相同,此时不用增加元素,那么以下标i-2为结尾的word1j-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;

  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;

  2. 确定遍历顺序

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

  3. 举例推导dp数组

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

    72.编辑距离1

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

编辑距离总结篇

文章讲解:代码随想录 (programmercarl.com)

相关内容

热门资讯

乐高蓝牙系统安卓,开启智能拼搭... 你有没有想过,那些五彩斑斓的乐高积木,竟然也能与现代科技完美结合?没错,今天我要跟你聊聊的就是这个神...
安卓系统怎么安装好,轻松完成设... 你有没有想过,为什么你的安卓手机总是感觉卡卡的呢?别急,今天就来给你支个招,让你的安卓系统焕然一新,...
安卓aoc重置系统卡住,探究原... 最近是不是你也遇到了安卓AOC电视重置系统时卡住的问题?这可真是让人头疼啊!别急,今天就来给你详细说...
安卓系统底层优缺点,揭秘其卓越... 你有没有想过,那个陪伴你每天刷手机、玩游戏、办公的安卓系统,其实背后有着不少秘密呢?今天,就让我带你...
安卓系统有没有omnifocu... 你有没有想过,在安卓系统上,有没有一款像iOS系统上那么好用的任务管理工具呢?比如,那个超级受欢迎的...
安卓手机系统被监控,隐私安全如... 你知道吗?最近有个话题在互联网上炒得火热,那就是安卓手机系统被监控的事情。这可不是开玩笑的,而是实实...
安卓手机主系统进副系统,探索多... 你有没有发现,你的安卓手机里藏着一个小秘密?没错,就是那个神秘的副系统!今天,就让我带你一探究竟,揭...
微软手机变安卓系统,开启新篇章 你知道吗?最近科技圈可是炸开了锅,微软手机竟然要变安卓系统了!这可不是什么小道消息,而是实实在在的官...
安卓系统驱动光驱在哪,安卓系统... 你有没有遇到过这种情况:电脑里装了安卓系统,突然想用光驱来播放一张珍藏的CD,结果找遍了整个系统,就...
安卓 奶茶点单系统,打造智能饮... 你有没有发现,现在去奶茶店点单,那可真是科技感满满啊!没错,我要说的就是那款让点单变得超级方便的安卓...
卓安手机防撞系统,出行无忧新篇... 你有没有想过,开车的时候,突然一个不小心,手机从口袋里滑了出来,直接撞到了方向盘上?这可不是什么好玩...
安卓系统电话拨号方法,安卓系统... 你有没有想过,手机里那个看似普通的电话拨号功能,其实藏着不少小秘密呢?今天,就让我带你一起探索安卓系...
吃鸡苹果系统改安卓系统,揭秘安... 你知道吗?最近有个大新闻在吃鸡圈里炸开了锅!那就是有人竟然把苹果系统的吃鸡游戏改成了安卓系统,这可真...
安卓哪个系统最好看,揭秘最佳视... 你有没有发现,手机系统就像是个时尚界的潮流达人,总在不断变换着风格,让人眼花缭乱。今天,咱们就来聊聊...
安卓版系统字体更换,个性化定制... 你有没有发现,手机里的字体有时候看久了会感觉有点审美疲劳呢?别急,今天就来给你支个招——安卓版系统字...
安卓以外系统的手机,探索iOS... 你有没有想过,手机的世界不仅仅只有安卓和苹果?是的,你没听错,安卓以外还有许多其他系统的手机在默默耕...
安卓系统能装classin,开... 你知道吗?现在安卓系统的手机和电脑上,竟然能装上ClassIn这个神奇的在线教育平台!是不是觉得有点...
安卓系统怎样重置指纹,安卓系统... 手机指纹解锁功能是不是让你觉得既方便又安全呢?但有时候,指纹识别出了问题,或者你想要给手机来个彻底的...
安卓系统电视4000内,智能娱... 你有没有想过,在家享受大屏幕观影体验,其实并不需要花大价钱呢?今天,就让我带你来探索那些在4000元...
手机安卓转苹果系统,系统切换攻... 你有没有想过,有一天你的手机从安卓系统华丽转身,变成了苹果系统的小公主呢?这可不是一般的变身,这可是...