【LeetCode每日一题】——72.编辑距离
创始人
2024-03-14 21:48:20
0次

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【解题思路】
  • 七【题目提示】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 字符串

二【题目难度】

  • 困难

三【题目编号】

  • 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’)

六【解题思路】

  • 本题较困难,利用动态规划的思想
  • 首先定义dp[i][j]dp[i][j]dp[i][j]表示word1word1word1的前iii个字符和word2word2word2的前jjj个字符之间的编辑距离
  • 之后分两种情况:
    • word1word1word1的前iii个字符和word2word2word2的前jjj个字符不相同:
      • 插入一个字符:dp[i][j]=dp[i][j−1]dp[i][j]=dp[i][j-1]dp[i][j]=dp[i][j−1]
      • 删除一个字符:dp[i][j]=dp[i−1][j]dp[i][j]=dp[i-1][j]dp[i][j]=dp[i−1][j]
      • 替换一个字符:dp[i][j]=dp[i−1][j−1]dp[i][j]=dp[i-1][j-1]dp[i][j]=dp[i−1][j−1]
      • 不管是以上哪种,都需要+1+1+1,因为都是一步操作
    • word1word1word1的前iii个字符和word2word2word2的前jjj个字符相同:
      • 取dp[i][j]dp[i][j]dp[i][j]和dp[i−1][j−1]dp[i-1][j-1]dp[i−1][j−1]之间的最小值,因为word1word1word1的前iii个字符和word2word2word2的前jjj个字符相同,说明不需要操作
  • 还需要注意一些细节,初始化第一列为iii(遍历word1word1word1),因为word1word1word1的每步字符串变为长度为000都需要iii步;初始化第一行为jjj(遍历word2word2word2),因为word2word2word2的每步字符串变为长度为000都需要jjj步
  • 最后返回dp[m][n]dp[m][n]dp[m][n]即可,其中m、nm、nm、n分别为两个字符串的长度

七【题目提示】

  • 0<=word1.length,word2.length<=5000 <= word1.length, word2.length <= 5000<=word1.length,word2.length<=500
  • word1和word2由小写英文字母组成word1 和 word2 由小写英文字母组成word1和word2由小写英文字母组成

八【时间频度】

  • 时间复杂度:O(mn)O(mn)O(mn),其中m、nm、nm、n分别为两个字符串的长度
  • 空间复杂度:O(mn)O(mn)O(mn),其中m、nm、nm、n分别为两个字符串的长度

九【代码实现】

  1. Java语言版
package String;/*** @Author: IronmanJay* @Description: 72.编辑距离* @CreateTime: 2022-12-03  10:27*/
public class p72_EditDistance {public static void main(String[] args) {String word1 = "horse";String word2 = "ros";int res = minDistance(word1, word2);System.out.println("res = " + res);}public static int minDistance(String word1, String word2) {int m = word1.length();int n = word2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 0; i < m + 1; i++) {dp[i][0] = i;}for (int i = 0; i < n + 1; i++) {dp[0][i] = i;}for (int i = 1; i < m + 1; i++) {for (int j = 1; j < n + 1; j++) {dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])) + 1;if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i][j]);}}}return dp[m][n];}}
  1. C语言版
#include
#includeint minDistance(char * word1, char * word2)
{int dp[501][501];int m = strlen(word1);int n = strlen(word2);dp[0][0] = 0;for (int i = 0; i <= m; i++){dp[i][0] = i;}for (int j = 0; j <= n; j++){dp[0][j] = j;}for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){dp[i][j] = fmin(dp[i][j - 1], fmin(dp[i - 1][j], dp[i - 1][j - 1])) + 1;if (word1[i - 1] == word2[j - 1]){dp[i][j] = fmin(dp[i][j], dp[i - 1][j - 1]);}}}return dp[m][n];
}/*主函数省略*/

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...