LeetCode刷题 | 583. 两个字符串的删除操作、72. 编辑距离

news/2024/11/25 6:23:54/

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

 

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

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

示例 1:

输入: word1 = "sea", word2 = "eat"

输出: 2

解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"

示例  2:

输入:word1 = "leetcode", word2 = "etco"

输出:4

动归五部曲:

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

dp[i][j]表示将下标0~i-1的子串word1和下标0~j-1的子串变得相同需要删除元素的最少次数。

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] = i,dp[0][j] = j

4. 遍历顺序

从上到下,从左到右

5. 举例推导dp数组

class Solution {public int minDistance(String word1, String word2) {int[][] dp = new int[word1.length() + 1][word2.length() + 1];for(int i = 1;i <= word1.length();i ++){dp[i][0] = i;}for(int j = 1;j <= word2.length();j ++){dp[0][j] = j;}for(int i = 1;i < word1.length() + 1;i ++){for(int j = 1;j < word2.length() + 1;j ++){if(word1.charAt(i - 1) == word2.charAt(j - 1)){dp[i][j] = dp[i - 1][j - 1];}else{dp[i][j] = Math.min(dp[i - 1][j - 1] + 2, Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1));}}}return dp[word1.length()][word2.length()];}
}

72. 编辑距离

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

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

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

示例 1:

输入:word1 = "horse", word2 = "ros"

输出:3

解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e')

示例 2:

输入:word1 = "intention", word2 = "execution"

输出:5

解释:

intention -> inention (删除 't')

inention -> enention (将 'i' 替换为 'e')

enention -> exention (将 'n' 替换为 'x')

exention -> exection (将 'n' 替换为 'c')

exection -> execution (插入 'u')

动归五部曲:

1. 确定dp数组和下标的含义

dp[i][j]表示下标范围为0~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]),此时就需要编辑了

  • 操作一: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]相同,此时不用增删加元素。

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;

3. dp数组初始化

dp[i][0] = i;

dp[0][j] = j;

4. 确定遍历顺序

从左往右,从上往下

5. 举例推导dp数组

 

class Solution {public int minDistance(String word1, String word2) {int[][] dp = new int[word1.length() + 1][word2.length() + 1];for(int i = 1;i <= word1.length();i ++){dp[i][0] = i;}for(int j = 1;j <= word2.length();j ++){dp[0][j] = j;}for(int i = 1;i < word1.length() + 1;i ++){for(int j = 1;j < word2.length() + 1;j ++){if(word1.charAt(i - 1) == word2.charAt(j - 1)){dp[i][j] = dp[i - 1][j - 1];}else{dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])) + 1;}}}return dp[word1.length()][word2.length()];}
}

http://www.ppmy.cn/news/723929.html

相关文章

倒计时1天!电信、联通正式停售达量限速套餐,网友:早办好了

最近几个月&#xff0c;通信网络是一个热门话题&#xff0c;携号转网、5G网络、5G手机都是用户热议的话题&#xff0c;尤其是5G手机准备大规模上市&#xff0c;流量套餐又要经历一批新的改革&#xff0c;要知道上个月三大运营商都宣布将取消达量限速&#xff0c;取而代之的是达…

固话月租费有望全免 包月套餐将逐步取代座机费

运营商表示暂不会“一刀切”,包月套餐或将逐步取代座机费 工信部日前发布消息称&#xff0c;自5月1日起&#xff0c;将调整普通固定电话临时短期租用业务资费管理方式&#xff0c;由目前的政府指导价改为实行市场调节价。这意味着现有的固定电话座机费有望得到调整。 目前&…

Web开播系统的技术演进

随着直播SaaS业务的深入发展&#xff0c;Web端开播的诉求变得越来越强烈&#xff0c;对比客户端开播工具如OBS&#xff0c;Web开播与SaaS平台亲和度高&#xff0c;可以让用户快速体验平台全流程&#xff0c;同时易于分享链接&#xff0c;快速连麦。因此&#xff0c;寻求更加稳定…

清空电脑垃圾文件好用指令

WinR调出运行窗口&#xff0c;然后用下面3个指令去操作 1、%temp% 这个文件夹是系统缓存文件&#xff0c;可以随意删除 2、cleanmgr 系统自带的磁盘清理工具

老电脑适合用linux,老旧电脑适于装什么操作系统

可以一起安装&#xff0c;有两种方法。要对硬盘进行分区&#xff0c;然后把不同的系统安装到各自的分区&#xff0c;还要有引导管理器对两个系统进行引导&#xff0c;选择进入哪一个系统。一般的PC是预装windows的&#xff0c;所以可以先用分区工具调整分区&#xff0c;空出来安…

好用计算机怎么打,电脑输入法有哪些_电脑上最好用的输入法排行 - 系统家园...

输入法是我们日常生活中必不可少的一种软件&#xff0c;尤其是使用电脑的用户们&#xff0c;但是很多用户们不知道电脑输入法有哪些&#xff0c;那个输入法比较好用等&#xff0c;那么适合电脑使用的输入法有哪些呢&#xff0c;快来看看吧~ 最好用的输入法排行&#xff1a; 一、…

中兴新支点国产操作系统新版本越来越好用了

中兴新支点桌面操作系统 V3.2.1版本正式发布了&#xff01;该版本是在 V3.0版本的基础上&#xff0c;针对Linux云桌面、办公、开发等多种场景新增了多个新特性&#xff0c;同时解决了开源组件中既有的数十个bug。 中兴新支点桌面操作系统介绍 中兴新支点桌面操作系统是基于Lin…

老电脑重装Linux系统

收拾地下室&#xff0c;看到一台将近二十年前配的电脑&#xff0c;抱着学习一下的态度&#xff0c;准备在上面安装Linux系统&#xff0c;做些简单计算。 CPU2.4GHz&#xff0c;内存512MB&#xff0c;硬盘80G 从外观上看&#xff0c;硬盘为IDE接口&#xff0c;类似这篇文章所展…