Java——编辑距离

news2024/9/21 12:33:27

题目链接

leetcode在线oj题——编辑距离

题目描述

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

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

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

题目示例

输入:word1 = “horse”, word2 = “ros”
输出:3
解释:
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)

输入:word1 = “intention”, word2 = “execution”
输出:5
解释:
intention -> inention (删除 ‘t’)
inention -> enention (将 ‘i’ 替换为 ‘e’)
enention -> exention (将 ‘n’ 替换为 ‘x’)
exention -> exection (将 ‘n’ 替换为 ‘c’)
exection -> execution (插入 ‘u’)

题目提示

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

解题思路

我们创建一个二维数组arr,行数是第一个单词的长度加一,列数是第二个单词的长度加一,其中arr[0][0]代表空字符串

例如,word1 = “test”,word2 = “xiao”创建的数组长这样
在这里插入图片描述
数组中存放的数字是一个单词的部分片段到另一个单词的部分片段的编辑次数
例如arr[0][1]就是空字符串到“t”需要的编辑次数
arr[0][2]就是空字符串到“te”需要的编辑次数
arr[2][0]就是空字符串到“xi”需要的编辑次数
arr[3][2]就是“xia”到“te”需要的编辑次数

很显然,如果将空字符串变成“a”,需要一步添加操作,将空字符串变成“ab”,需要两步添加操作

因此,arr[i][0] = i,arr[0][i] = i
在这里插入图片描述
现在我们来研究arr[1][1]等于多少,也就是"x"变成“t”需要几步,分为下面三种情况:

  • 情况一:先将x删除,再添加一个t
    -情况二: 先加一个t,再将x删除
  • 情况三:直接由x替换成t

先删除x相当于将x变成空字符串,也就是arr[1][0]
再添加一个t需要一步操作,因此第一种情况相当于arr[1][0] + 1 = 2

先添加t相当于将空字符串加一个“t”,也就是arr[0][1]
再删除一个x需要一步操作,因此第二种情况相当于arr[0][1] + 1 = 2

直接将x替换成t不需要对其他字符进行变更,因此相当于空字符串变成空字符串,然后再加上一个变更操作,因此第三种情况相当于arr[0][0] + 1 = 1

取这三种情况的最小值,因此arr[1][1] = 1

再研究一下arr[1][2]等于多少,也就是x变成te需要多少步

  • 情况一: 先将x变成t,再添加e
  • 情况二: 先添加t, 添加e,再删除x
  • 情况三: 先添加t,再将x替换成e

先将x变成t对应arr[1][1],再添加一个e需要一步操作,因此第一种情况相当于arr[1][1] + 1 = 2

先添加t,添加e相当于将空字符串加“te”,也就是arr[0][2],再删除一个x需要一步操作,因此第二种情况相当于arr[0][2] + 1 = 3

先添加t相当于将空字符串加一个“t”,也就是arr[0][1]
再将x变成e需要一步操作,因此第二种情况相当于arr[0][1] + 1 = 2

在这里插入图片描述

我们可以找到规律:arr[i][j]的值是其左上角,上面,左面三个元素的较小者加1

arr[i][j] = Math.min(arr[i - 1][j], arr[i][j - 1], arr[i - 1][j - 1]) + 1;

但事实上,如果两个字符串的结尾字母是相同的,只需要将前几个字符变更就行了,例如"tea"和“cba”,我们并不需要替换最后一个字母
因此当最后一个字母相同时:

arr[i][j] = arr[i - 1][j - 1];

代码

class Solution {
    public int minDistance(String word1, String word2) {
        int row = word1.length();
        int col = word2.length();

        int[][] arr = new int[row + 1][col + 1];

        for (int i = 0; i <= row; i++) {
            arr[i][0] = i;
        }
        for (int i = 0; i <= col; i++) {
            arr[0][i] = i;
        }

        for (int i = 1; i <= row; i++) {
            for (int j = 1; j <= col; j++) {
                arr[i][j] = Math.min(arr[i - 1][j], arr[i][j - 1]) + 1;
                if(word1.charAt(i - 1) == word2.charAt(j - 1)){
                    arr[i][j] = Math.min(arr[i][j] , arr[i - 1][j - 1]);
                } else {
                    arr[i][j] = Math.min(arr[i][j] , arr[i - 1][j - 1] + 1);
                }
            }
        }
        return arr[row][col];
    }
}

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

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

相关文章

搭建DJI 无人机Onboard SDK ROS开发环境及测试

搭建DJI 无人机Onboard SDK ROS开发环境及测试功能包简介开发环境搭建测试功能包连接设备启动SDK功能包简介 ROS功能包名称&#xff1a;dji_sdk 功能包功能&#xff1a;用于DJI 板载SDK的ROS版本 OSDK 是一个用于开发无人机应用程序的开发工具包&#xff0c;基于OSDK 开发的…

CUDA线程层次一文搞懂|参加CUDA线上训练营

设备术语 Host&#xff1a;CPU 和 内存 (host memory)Device&#xff1a;GPU 和显存 (device memory) CUDA 线程层次 CUDA 线程层次分为&#xff1a; Thread 所有线程执行相同的核函数并行执行 Thread Block 执行在一个 Streaming Multiprocessor &#xff08;SM&#xff09…

Python快速上手系列--异常处理--详解篇

本章所说的就是我们经常遇到的一个问题&#xff0c;报错、异常。我们应该如何处理&#xff0c;让它不影响后面的程序运行。异常首先我们看看一个简单的示例。print(2/0)其结果可想而知&#xff0c;当然是报错了&#xff01;程序被终止了&#xff01;这里会提示用户&#xff0c;…

索引-性能分析-慢查询日志

索引语法 1、创建索引时候 [UNIQUE | FULLTEXT] 关键字是可选的&#xff1b; 1&#xff09;加上 UNIUQE 就是创建唯一索引&#xff08;唯一索引&#xff0c;说明改字段不能出现重复数据&#xff09;&#xff1b; 2&#xff09;加上FULLTEXT 创建的是一个全文索引&#xff1b;…

Webpack5 环境下 Openlayers 标注(Icon) require 引入图片问题

Webpack5 环境下 Openlayers 标注&#xff08;Icon&#xff09; require 引入图片问题环境版本Openlayers 使用 require 问题Webpack5 正确配置构建新环境的时候&#xff0c;偶然发现 Openlayers 使用 require 的方式加载图片&#xff08;Icon&#xff09;报错&#xff0c;开始…

电子技术——DC偏移

电子技术——DC偏移 因为差分放大器是直接耦合的并且对于DC有着有限的增益&#xff0c;因此本节我们讨论差分放大器在DC相关方面的问题。 MOS差分放大器的输入偏移电压 考虑下面的电路&#xff0c;我们将MOS差分放大器的输入端都置地&#xff1a; 此时假如电路完全对称&#…

IP地址:揭晓安欣警官自证清白的黑科技

《狂飙》这部电视剧&#xff0c;此从播出以来可谓是火爆了&#xff0c;想必大家都是看过的。剧中&#xff0c;主人公“安欣”是一名警察。一直在与犯罪分子做斗争。 莽村的李顺案中&#xff0c;有匿名者这个案件在网上发帖恶意造谣&#xff0c;说安欣是黑恶势力的保护伞&#…

将视频作为桌面动态壁纸,只需要两步,让你保存的视频在桌面动起来,动态壁纸工具,视频动态壁纸,小风车,桌面美化工具

这款软件可以让你宝贵的视频资源变成动态壁纸显示在你的电脑上&#xff0c;体积小巧&#xff0c;不需要安装&#xff0c;即点即用。 一、软件简介 这是一款可以将视频文件作为动态壁纸展示在电脑桌面的软件&#xff0c;它体积小巧&#xff0c;占用资源也不多&#xff0c;相比…

SpringMVC基础入门(一)之理论基础概念

文章目录SpringMVC1.概念2.常用注解请求与响应1.请求参数2.JSON传输3.常用注解响应1.响应页面2.响应JSON数据Rest风格1.介绍2.常用注解SpringMVC 1.概念 &#xff08;1&#xff09;定义 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架。 &#xff08;2&#xff09;为什…

test2

物理层故障分析 一、传输介质故障 a.主要用途简述 传输介质主要分为 导向传输介质和非导向传输介质。前者包括双绞线&#xff08;两根铜线并排绞合&#xff0c;距离过远会失真&#xff09;、同轴电缆&#xff08;铜质芯线屏蔽层&#xff0c;抗干扰性强&#xff0c;传输距离更…

VScode查看python f.write()的文件乱码

VScode查看python f.write()的文件乱码 在使用 VScode 编写 python 代码&#xff0c; print&#xff08;&#xff09;&#xff0c;汉字正常显示&#xff0c; 使用 with open&#xff08;&#xff09;as f&#xff1a; f.write&#xff08;&#xff09;文件后&#xff0c; 在 …

【Java】HashMap原理

哈希表&#xff08;Hash table&#xff09; 也叫散列表&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。也就是说&#xff0c;它通过计算一个关于键值的函数&#xff0c;将所需查询的数据映射到表中一个位置来访问记录&#xff0c;这加快…

nvm安装后出现‘node‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

出现这个问题多半是path地址不对。 打开系统环境变量。看看path里面有没有&#xff1f;没有的话&#xff0c;加上就行&#xff01; 我的报错原因就是因为path里没有自动加上nvm的相关路径。 注意项&#xff1a; 1&#xff0c;在安装nvm之前&#xff0c;提前要把本机以前安装…

剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)

剑指 Offer 32 - II. 从上到下打印二叉树 II&#xff08;java解题&#xff09;1. 题目2. 解题思路3. 数据类型功能函数总结4. java代码5. 踩坑记录1. 题目 从上到下按层打印二叉树&#xff0c;同一层的节点按从左到右的顺序打印&#xff0c;每一层打印到一行。 例如: 给定二叉…

2023年开始,为什么公司运营依赖于流程文档?

当您的业务扩展时&#xff0c;您会得到越来越多的活动部件&#xff0c;跟踪复杂性是某人的工作。人员和任务需要以最有成效的方式组织&#xff0c;您必须找到某种方式让员工知道如何执行有效完成工作所需的流程。为了使过程可重复&#xff0c;需要将其记录在案。有人需要写下你…

关于conda env导出yaml无法create的问题解决

在使用conda env 命令创建package 列表之后&#xff0c;无法用yml文件创建新的环境。 这是因为在环境导出的时候没有加--no-builds 这个选项。 conda env export 正确的导出环境的做法如下&#xff1a; conda env export --no-builds > environment.yml--no-builds 的作用…

(C语言)自定义类型,枚举与联合

问&#xff1a;1. 结构体在自引用的时候不能怎么样&#xff1f;可以怎么样&#xff1f;2. Solve the problems&#xff1a;自定义一个学生结构体类型&#xff0c;要包含姓名&#xff0c;性别&#xff0c;年龄&#xff0c;六科成绩&#xff0c;家乡&#xff08;也为结构体&#…

服务器开发29:Kubernetes (K8S)上手简单实践(2/13)

文章目录一、Kubernetes (K8S) 简介1&#xff09;简介2&#xff09;主要特性&#xff1a;3&#xff09;学习前提4&#xff09;不同部署方案5&#xff09;为什么需要K8S6&#xff09;K8S集群架构7&#xff09;Kubernetes 组件二、安装k8s集群1&#xff09;安装方式介绍2&#xf…

python笔记-- “__del__”析构方法

-#### 1、基本概念&#xff08;构造函数与析构函数&#xff09; 特殊函数&#xff1a;由系统自动执行&#xff0c;在程序中不可显式地调用他们 构造函数&#xff1a; 建立对象时对对象的数据成员进行初始化&#xff08;对象初始化&#xff09; 析构函数&#xff1a; 对象生命期…

【IPD】集成产品开发培训课程「3月4-5日」

课程名称集成产品开发&#xff08;Integrate Product Development&#xff09;参加对象企业CEO/总经理、产品总监、研发总监/副总、总工/技术总监、市场总监、制造总监、采购总监、产品经理/研发项目经理、研发管理部/技术管理部经理、流程管理部/质量管理部经理、项目管理及质…