【LeetCode每日一题】——72.编辑距离

news2024/11/14 21:06:16

文章目录

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

一【题目类别】

  • 字符串

二【题目难度】

  • 困难

三【题目编号】

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

六【解题思路】

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

七【题目提示】

  • 0 < = w o r d 1. l e n g t h , w o r d 2. l e n g t h < = 500 0 <= word1.length, word2.length <= 500 0<=word1.length,word2.length<=500
  • w o r d 1 和 w o r d 2 由 小 写 英 文 字 母 组 成 word1 和 word2 由小写英文字母组成 word1word2

八【时间频度】

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

九【代码实现】

  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<stdio.h>
#include<stdlib.h>

int 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语言版
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】常用的Linux命令(初学者必读)

一、学习Linux的原因 开源&#xff0c;免费系统迭代更新系统性能稳定安全性高多任务&#xff0c;多用户耗资源少内核小应用领域广泛使用及入门容易 二、Linux常用的命令 我使用的Linux环境是在 腾讯云服务器上的Centos 7和 Xshell。 下面我把常用的一些命令分成了几个部分&am…

VPS8505 微功率隔离电源专用芯片2.3-6VIN/24V/1A 功率管 替代金升阳模块

文章目录 前言一、是什么&#xff1f;二、特点三、应用领域四、简化应用五、引脚及功能六、参数测试电路 总结前言 隔离电源市场&#xff0c;一直被塑封模块产品占领&#xff0c;之前国内无专业 做隔离芯片的厂家&#xff0c;市场以模块厂进口芯片方案为主&#xff1b;…

深入 Java 线程池:从设计思想到源码解读

为什么需要线程池 我们知道创建线程的常用方式就是 new Thread() &#xff0c;而每一次 new Thread() 都会重新创建一个线程&#xff0c;而线程的创建和销毁都需要耗时的&#xff0c;不仅会消耗系统资源&#xff0c;还会降低系统的稳定性。在 jdk1.5 的 JUC 包中有一个 Execut…

从实用角度浅析前端全链路质量监控中台技术方案

大厂技术 高级前端 Node进阶点击上方 程序员成长指北&#xff0c;关注公众号回复1&#xff0c;加入高级Node交流群感谢作者陈煮酒的投稿。前言无论是纯前端业务还是服务端业务&#xff0c;线上质量的保障都是我们的底线要求&#xff0c;也是我们日常需要花费很多精力关注的环…

【大数据入门核心技术-Zookeeper】(五)ZooKeeper集群搭建

目录 一、准备工作 1、集群分布 2、创建数据目录 3、下载安装包 二、解压安装 1、解压 2、修改配置文件zoo.cfg 3、添加myid配置 4、分发zk文件夹和分别新建myid 5、配置环境变量 6、三台机器分别启动zookeeper服务 一、准备工作 1、集群分布 服务器IP主机名myid的…

有损压缩与无损压缩

有损压缩与无损压缩数据压缩有损压缩无损压缩有损压缩与无损压缩的区别Which One to Use?Final Words有损压缩、无损压缩&#xff08;图片、音频、视频&#xff09;图片文件格式音频文件格式视频文件格式数据压缩 数据压缩&#xff08;Data Compression&#xff09;是减小任何…

教你6招轻松搞定 网站被木马反复篡改

提到网络被恶意篡改&#xff0c;应该让很多做了百度竞价的企业官网怀恨已久了吧&#xff1f;这类行为的目的就是通过这些受害网站获得排名并跳转到违法网站&#xff0c;达到不法的目的。对于企业来说不但损失了百度竞价的费用&#xff0c;还对企业形象造成很大的影响。甚至直接…

【Flink】检查点算法实现原理之检查点分界线

一 检查点的实现算法 一种简单的想法&#xff08;同步的思想&#xff09; 暂停应用保存状态到检查点再重新恢复应用&#xff08;Spark Streaming&#xff09; Flink 的改进实现&#xff08;异步的思想&#xff09; 基于 Chandy-Lamport 算法的分布式快照算法将检查点的保存和数…

20221203使用python3处理Google翻译英文SRT格式字幕

20221203使用python3处理Google翻译英文SRT格式字幕 1、暂时不处理UNICODE编码的TXT&#xff0c;本例以ANSI编码的TXT为准。 2、将来处理自动处理目录中的全部TXT文件。&#xff08;甚至递归处理子目录中的TXT文件&#xff09; 源码&#xff1a; #f_pathrC:\Users\Admin\Desk…

如何解hard算法题?

如何解困难题&#xff1f;前言一、案例二、困难题拆解1、自己的思路2、官方的思路3、源码Javagolang总结参考文献前言 上一篇文章写bitCount源码解析&#xff0c;对困难题有一些抽象的理解。 困难题就是一个个简单的知识点组成&#xff0c;加上其内在的逻辑联系。所以一个困难…

S2SH志愿者捐赠管理系统|捐助计算机毕业论文Java项目源码下载

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《基于S2SH实现的志愿者捐赠管理系统》该项目采用技术jsp、strust2、Spring、hibernate、tomcat服务器、mysql数据库 &#xff0c;项目含有源码、…

02、数据卷(Data Volumes)以及dockefile详解

目录 1、Docker 数据管理 2、数据卷(Data Volumes) 3、数据卷容器 4、dockerfile 5、dockerfile基本结构 6、docker使用Dockerfile创建jdk容器 启动虚拟机&#xff0c;进入CentOS 7、dockerfile实践经验 1、Docker 数据管理 在生产环境中使用 Docker &#xff0c;往往需…

混合动力电动车优化调度与建模(发动机,电机,电池组等组件建模)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…

6-4布线问题(分支限界)

6-4布线问题&#xff08;分支限界&#xff09; 一、问题描述 印刷电路板将布线区域划分成m*n个方格阵列,如图(1)所示。 精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。 在布线时,电路只能沿直线或直角布线,如图(2)所示。 为了避免线路相交&#xf…

C语言第十二课(下):操作符详解【逗号表达式、下标引用、函数调用、结构成员操作符与操作符属性】

目录 前言&#xff1a; 一、逗号表达式&#xff08;exp1&#xff0c;exp2&#xff0c;exp3&#xff0c;...&#xff0c;expN&#xff09;&#xff1a; 二、下标引用、函数调用和结构成员[ ]、( )、. 、->&#xff1a; 1.下标引用操作符[ ]&#xff1a; 2.函数调用操作符( …

Tomcat过时了?别多想,很多公司还是在用的。这份Tomcat架构详解,真的颠覆你的认知

Tomcat 不但没有过时&#xff0c;Spring Boot 还给 Tomcat 第二春了。 微服务的兴起&#xff0c;Tomcat 针对很多应用已经做成 embedded 模式了&#xff0c;Tomcat 本身是容器&#xff0c;Tomcat 的出现就是为了解决但是 EJB 和 Weblogic&#xff0c;JBoss 这种大而全的大象导致…

C++ OpenCV【视频合并:多个图像拼接在一张图像】

提示&#xff1a;本文中视频拼接指的是将多张图像按空间合并在一张图像上&#xff0c;而不是将多张图像按时间顺序拼接成一个多帧片段。 文章目录 前言 一、OpenCV知识点 1.OpenCV裁剪矩形区域赋值 2.OpenCV将Mat粘贴到指定位置 二、程序样例 1.程序源码 2.运行结果 前言 C版…

[附源码]Python计算机毕业设计Django姜太公渔具销售系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

看完这篇,还不懂JAVA内存模型(JMM)算我输

前言 开篇一个例子&#xff0c;我看看都有谁会&#xff1f;如果不会的&#xff0c;或者不知道原理的&#xff0c;还是老老实实看完这篇文章吧。 Slf4j(topic "c.VolatileTest") public class VolatileTest {static boolean run true;public static void main(Str…

一个简单的HTML网页 个人网站设计与实现 HTML+CSS+JavaScript自适应个人相册展示留言博客模板

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…