代码随想录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)

相关内容

热门资讯

电视安卓系统哪个品牌好,哪家品... 你有没有想过,家里的电视是不是该升级换代了呢?现在市面上电视品牌琳琅满目,各种操作系统也是让人眼花缭...
安卓会员管理系统怎么用,提升服... 你有没有想过,手机里那些你爱不释手的APP,背后其实有个强大的会员管理系统在默默支持呢?没错,就是那...
安卓系统软件使用技巧,解锁软件... 你有没有发现,用安卓手机的时候,总有一些小技巧能让你玩得更溜?别小看了这些小细节,它们可是能让你的手...
安卓系统提示音替换 你知道吗?手机里那个时不时响起的提示音,有时候真的能让人心情大好,有时候又让人抓狂不已。今天,就让我...
安卓开机不了系统更新 手机突然开不了机,系统更新还卡在那里,这可真是让人头疼的问题啊!你是不是也遇到了这种情况?别急,今天...
安卓系统中微信视频,安卓系统下... 你有没有发现,现在用手机聊天,视频通话简直成了标配!尤其是咱们安卓系统的小伙伴们,微信视频功能更是用...
安卓系统是服务器,服务器端的智... 你知道吗?在科技的世界里,安卓系统可是个超级明星呢!它不仅仅是个手机操作系统,竟然还能成为服务器的得...
pc电脑安卓系统下载软件,轻松... 你有没有想过,你的PC电脑上安装了安卓系统,是不是瞬间觉得世界都大不一样了呢?没错,就是那种“一机在...
电影院购票系统安卓,便捷观影新... 你有没有想过,在繁忙的生活中,一部好电影就像是一剂强心针,能瞬间让你放松心情?而我今天要和你分享的,...
安卓系统可以写程序? 你有没有想过,安卓系统竟然也能写程序呢?没错,你没听错!这个我们日常使用的智能手机操作系统,竟然有着...
安卓系统架构书籍推荐,权威书籍... 你有没有想过,想要深入了解安卓系统架构,却不知道从何下手?别急,今天我就要给你推荐几本超级实用的书籍...
安卓系统看到的炸弹,技术解析与... 安卓系统看到的炸弹——揭秘手机中的隐形威胁在数字化时代,智能手机已经成为我们生活中不可或缺的一部分。...
鸿蒙系统有安卓文件,畅享多平台... 你知道吗?最近在科技圈里,有个大新闻可是闹得沸沸扬扬的,那就是鸿蒙系统竟然有了安卓文件!是不是觉得有...
宝马安卓车机系统切换,驾驭未来... 你有没有发现,现在的汽车越来越智能了?尤其是那些豪华品牌,比如宝马,它们的内饰里那个大屏幕,简直就像...
p30退回安卓系统 你有没有听说最近P30的用户们都在忙活一件大事?没错,就是他们的手机要退回安卓系统啦!这可不是一个简...
oppoa57安卓原生系统,原... 你有没有发现,最近OPPO A57这款手机在安卓原生系统上的表现真是让人眼前一亮呢?今天,就让我带你...
安卓系统输入法联想,安卓系统输... 你有没有发现,手机上的输入法真的是个神奇的小助手呢?尤其是安卓系统的输入法,简直就是智能生活的点睛之...
怎么进入安卓刷机系统,安卓刷机... 亲爱的手机控们,你是否曾对安卓手机的刷机系统充满好奇?想要解锁手机潜能,体验全新的系统魅力?别急,今...
安卓系统程序有病毒 你知道吗?在这个数字化时代,手机已经成了我们生活中不可或缺的好伙伴。但是,你知道吗?即使是安卓系统,...
奥迪中控安卓系统下载,畅享智能... 你有没有发现,现在汽车的中控系统越来越智能了?尤其是奥迪这种豪华品牌,他们的中控系统简直就是科技与艺...