Leetcode 72. 编辑距离

LeetCode 第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. 删除:删除操作,距离 + 1,并向前匹配。
  2. 插入:插入操作,距离 + 1,并向前匹配。
  3. 修改:修改操作,距离 + 1,并向前匹配。
代码
class Solution {
    public int minDistance(String word1, String word2) {
        if(word1.isEmpty()) return word2.length();
        if(word2.isEmpty()) return word1.length();
    
        int n = word1.length();
        int m = word2.length();
        if(word1.charAt(n - 1) == word2.charAt(m - 1)) {
            return minDistance(word1.substring(0, n - 1), word2.substring(0, m - 1));
        } else {
            int delete = 1 + minDistance(word1.substring(0, n - 1), word2.substring(0, m));
            int insert = 1 + minDistance(word1.substring(0, n), word2.substring(0, m - 1));
            int update = 1 + minDistance(word1.substring(0, n - 1), word2.substring(0, m - 1));
            
            return Math.min(Math.min(delete, insert), update);
        }
    }
}
结果

在这里插入图片描述
直接递归超时了,因为有很多重复的计算,可以使用备忘录优化。

备忘录法复杂度:O(nm) 时间,O(nm) 空间。

备忘录代码
class Solution {

    private Integer[][] memo;
    public int minDistance(String word1, String word2) {
        int n = word1.length();
        int m = word2.length();
        memo = new Integer[n + 1][m + 1];
        return minDistance(word1.toCharArray(), n, word2.toCharArray(), m);
    }
    
    private int minDistance(char[] w1, int i, char[] w2, int j) {
        if(memo[i][j] != null) return memo[i][j];
        
        int ret = 0;
        if(i == 0) {
            ret = j;
        } else if(j == 0) {
        	ret = i;
        } else {
            if(w1[i - 1] == w2[j - 1]) {
            	ret = minDistance(w1, i - 1, w2, j - 1);
            } else {
                int delete = 1 + minDistance(w1, i - 1, w2, j);
                int insert = 1 + minDistance(w1, i, w2, j - 1);
                int update = 1 + minDistance(w1, i - 1, w2, j - 1);

                ret = Math.min(Math.min(delete, insert), update);
            }
        }
        
        memo[i][j] = ret;
        return ret;
    }
}
结果

在这里插入图片描述

解法二:动态规划

状态定义:dp[i][j] 表示 word1[0…i -1] 与 word2[0…j -1] 的编辑距离。

状态转移:

  1. 如果 word1[i-1] == word2[j-1] :dp[i][j] = dp[i-1][j-1]
  2. 如果 word1[i-1] != word2[j-1] :dp[i][j] = min(插入, 删除, 修改) + 1
    1. 插入:dp[i][j-1]
    2. 删除:dp[i-1][j]
    3. 修改:dp[i-1][j-1]

初始化:

  • dp[i][0] = i
  • dp[0][j] = j

返回值:dp[n][m]

复杂度:O(nm) 时间,O(nm) 空间。(tips:可以尝试优化成O(n + m) 的空间复杂度)

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

在这里插入图片描述

【简单】力扣算法题解析LeetCode72:编辑距离 这篇文章介绍了如何使用动态规划解决字符串编辑距离问题,通过滚动数组优化空间复杂度。编辑距离是指将一个字符串转换为另一个字符串所需的最少操作数(插入、删除或替换字符)。文章详细解释了动态规划的状态转移方程,并提供了Java代码实现,包括边界处理、空间优化策略和初始化方法。代码通过维护两个一维数组(prev和curr)来减少空间使用,最后返回转换所需的最小操作数。该解法的时间复杂度为O(mn),空间复杂度为O(min(m, n)),适用于较长的字符串。附有代码示例和执行结果截图,便于理解算法流程。 阅读详情

相关推荐

STM32使用内部RC振荡器作为系统时钟开发项目--内晶振启动模板工程

STM32使用内部RC振荡器时,OSC32_IN,OSC32_OUT接法: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法:    2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。    2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出

overflyme的博客 1万+

leetcode:72. 编辑距离

题目来源 leetcode 题目描述 题目解析 递归 共有三种变换方式,插入一个字符,删除一个字符,和替换一个字符 分析: 不可以用map统计字符出现的频率,因为字符串的顺序很重要 [删除] 和[添加]是等价的。比如"qwe"与"qwer",删除"qwer"的r与给"qwe"添加一个r是等价的。所以在比较的时候,需要尝试三种操作,因为谁也不知道当前的操作会对后面产生什么样的营销。 对于当前比较的两个字符word1[i]和word2[j]: 如果两者相同,直接跳到下一个为止 如果两者不相同,有三种

OceanStar的博客 5290

别再傻傻分不清!Synopsys DC综合中link/target/symbol/synthetic四大库的保姆级配置指南

本文详细解析了Synopsys DC综合中link_library、target_library、symbol_library和synthetic_library四大库的配置方法,帮助工程师避免常见错误。通过实战示例和调试技巧,指导如何正确设置工艺库与IP库,提升数字芯片设计效率。

weixin_42562079的博客 422

【Leetcode72】编辑距离(动态规划)

编辑距离可以通过以下三种操作进行计算:插入一个字符、删除一个字符、替换一个字符。初始条件:也只有两个字符串都相同或者都是空时编辑距离才为0,先全都将。根据状态转移方程,下标大的dp值都能从下标小的dp值计算得到,所以。边界:如果word1和word2其中一个没字母,即。个单词,变换到word2中前。个字符,最少需要的动作次数。,即一路加到底和一路减到底。(3)边界+初始条件。是边界情况,值分别为。

发现问题,并解决问题,批判性思维 2056

【Docker】Docker安装Hadoop分布式集群

hadoop目录安装在:/usr/local/hadoop-2.7.0/etc/hadoop。访问Hadoop102:9870,查看是否能够看到hdfs界面。访问hadoop103:8088,查看能够看到yarn界面。在yarn上可以看到执行情况。

weixin_46429290的博客 3459

大白话,Android Studio安装及其资源分享(离线gradle配置)

安装AndroidAtudio,并通过aliClound镜像与离线gradle配置,来跳过相对“繁文缛节”的过程,直接实现开发

wangzixuanemp的博客 3597

181、【动态规划】leetcode ——72. 编辑距离(C++版本)

dp[i][0] = dp[0][i] = i,另一方为0时需要删除i次或修改i次。dp中的i对应word1中的i-1,dp中的j对应word2中的j-1。,直接由上一步转移过来。结尾子串,经过最少次增删改后,可让。从左到右,从上到下。

STAR GAME 727

从圆形到椭圆:CenterNet中高斯热图半径的自适应优化策略

本文深入探讨了CenterNet目标检测模型中高斯热图生成策略的优化,针对传统圆形高斯核在处理长宽比差异大目标时的局限性,提出了自适应椭圆高斯核的解决方案。通过数学推导和代码实战,详细阐述了如何根据目标边界框尺寸动态计算椭圆长短轴半径,生成更贴合目标几何形状的热图监督信号,从而有效提升模型,尤其是对无人机、车辆等不规则目标的定位精度。

alice7model的博客 985

【LeetCode】动态规划—72. 编辑距离(附完整Python/C++代码)

编辑距离问题是字符串处理中的经典问题之一,广泛应用于拼写纠正、DNA序列比对等领域。通过计算将一个字符串转换为另一个字符串所需的最小操作数,能够帮助我们评估它们之间的相似度。本文将详细分析编辑距离问题的基本思路,提供动态规划的实现方法,并展示 Python 和 C++ 的代码示例。

Albert_Lsk的博客 3729

上位机图像处理和嵌入式模块部署(qmacvisual入门)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 虽然我们前面学习了很多的知识点,比如说在windows这边,用qt写界面,用opencv写图像处理代码;在linux这边先用树莓派测试,最后再部署到自己的平台上面。但是,对于一个商业软件是怎么运行的,很多时候我们心理还是没有底,或者说,自己写的软件距离一个商业软件还有多远,大部分学习的同学是不知道的。 就算有的同学说,这个时候可以借鉴一下vision pro,或者是

嵌入式-老费,一个分享专业嵌入式知识的blog 1227

uniapp - 解决真机调试报错 request:fail abort statusCode:-1 java.security.cert.CertPathValidatorException: Tr

uni-app,真机调试报错,app端平台,安卓Android,安卓App发布线上报错,打包后接口请求失效了,api接口报错,真机运行安卓app时接口不通且报错,request:failabortstatusCode:-1java.security.cert.CertPathValidatorException:Trustanchorforcertificationpathnotfound.,真机调试,苹果ios真机报错,Uniapp打包到app后报错,uni-app真机调试报错,服务器

🏆 前端领域优质创作者 1万+

力扣LeetCode72.编辑距离及Python源码实现

本题为LeetCode题库中第72题编辑距离,难度困难,题目请参考这里。这道题应该是字符串处理,自然语言算法工程师必做一道题目,很久都没想到解决思路突然有了灵感。 标准的DP题目,这道题的难点还是在于如何去定义状态转移方程,前面分享的那道地下城游戏也是难在定义状态转移方程,所以如何去定义才是最重要的!然后就是推导出如何变换。这种题很容易就想复杂了,而且情况一多根本就不知道怎么入手,这就陷入了僵局,如何跳出来?只能多刷题培养这种思维。 定义: 当字符串word1的长度为i,字符串word2的长度为j

Alex__Mahone的专栏 960

华为HCIP的学习大纲和计划

HCIP(华为认证 ICT 高级工程师)核心围绕华为 ICT 技术体系,不同方向(如路由交换、云计算、安全等)课程目录不同,以下是最热门的。

迷逝 573

LeetCode72 编辑距离

LeetCode72 编辑距离 算法思想:这是一个经典的笔试面试题。这里用到DP的方法求解,dp(i)(j)表示的是第一个字符串的第i个位置和第二个字符串的第j个位置的编辑距离。要计算这个编辑距离就可以从dp(i-1)(j-1)和dp(i-1)(j)和dp(i)(j-1)这几个角度去考虑。当第i-1个字符和第j-1个字符相等的时候,dp(i)(j)=dp(i-1)(j-1),否则的话,可能是修改...

raoxinyue的博客 696

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【算法题】72. 编辑距离-力扣(LeetCode)

本题看初看题目的增、删、改,会感觉非常困难,因为我们自己在利用例子模拟的时候都比较难。 但是我们不妨换个思路,利用动态规划的思想,将这个问题转换成一个个子问题,利用子问题的答案来得出最终答案。

Janium的博客 834

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

力扣LeetCode #72 编辑距离(MinDistance)

- 题目描述 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 提示: 0 <= word1.length, word2.length <= 500 word1 和 word2 由小写英文字母组成 来源:LeetCode - 示例 示例 1: 输入:word1 = “horse”, word2 = “ros” 输出:3 解释: horse ->

weixin_49155948的博客 758

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

72. 编辑距离 - 力扣(LeetCode)

给你两个单词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')

Dubhehug的博客 440

LeetCode 力扣 72. 编辑距离

题目描述(困难难度) 由一个字符串变为另一个字符串的最少操作次数,可以删除一个字符,替换一个字符,插入一个字符,也叫做最小编辑距离。 解法一 递归 我们可以发现删除一个字符和插入一个字符是等效的,对于变换次数并没有影响。例如 "a" 和 "ab" ,既可以 "a" 加上一个字符 "b" 变成 "ab",也可以是 "ab" 去掉一个字符 "b" 变成 "a"。所以下边的算法可以只考虑删除和替换。...

wind_liang的博客 1118

LeetCode72-编辑距离

LeetCode72-编辑距离 Leetcode / 力扣 72. 编辑距离: 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse -> rorse (将 'h' 替换为 'r') rors

baodream的博客 593

力扣72题编辑距离

去三者的最小值,就是最小的编辑次数。

qq_40603125的博客 560

LeetCode 72 —— 72.编辑距离

...最后有一种边界情况,如果要比较一个空的字符串与一个非空的字符串,那么编辑距离就是非空字符串的长度。但是实际上,我们可以直接替换 n 为 x,替换 i 为 e,这样就可以得到最短路径 = 2。这个时候前面的 i -> e, 也直接替换就可以了,所以其距离就是这两次替换,也就是 2。我们只看最后一个字母,就是 n -> x,我们直接将其替换就可以了。上面这两种方案都是先删除,再替换,再增加,都是绕远路的办法。以上的三种路径中,我们取其最小值即可。的距离为 2, 所以在这条路径上,的距离为 1...

刘伟佳的博客 1674

LeetCode 72.编辑距离

LeetCode 72.编辑距离 双序列型 确定状态: 设f[i][j]为A前i个字符A[0..i-1]和B前j个字符B[0..j-1]的最小编辑距离。 有三种情况: A在最后插入B[j-1] A的最后一个被替换为B[j-1] A删掉最后一个字符 A和B最后一个字符相等 转移方程 f[i][j] = min{f[i][j-1]+1, f[i-1][j-1]+1, f[i-1][j]+1, f[...

未命名 161

力扣-72-编辑距离

四种情况: 样本对应模型(字符串比较最后一个字符,选择最小的答案)

lan_jianwen的博客 213

[动态规划]Leetcode72.编辑距离(python)

[动态规划]Leetcode72.编辑距离 如果读者对于动态规划思路解法还不是很了解,可以先点击链接查阅我之前的一篇博文《算法之【动态规划】详解》,很详细的介绍了动态规划求解思路及方法,有利于你更好的学习动态规划。 题目描述 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例1 输入:word1 = “horse”, word2 = “ros” 输出:3

阿旭的博客 703

leetcode 72. 编辑距离

leetcode 72. 编辑距离 题目描述 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse -> rorse (将 'h' 替换为 'r') rorse -> rose (删除 'r') rose -> ros (删除 'e') 示

小白的成长 269

Python描述 LeetCode 72. 编辑距离

给你两个单词 和 , 请返回将 转换成 所使用的最少操作数 。你可以对一个单词进行如下三种操作:示例 1: 示例 2: 提示:动态规划。

一起加油 829
上一篇: Leetcode 97. 交错字符串
下一篇: Leetcode 115. 不同的子序列
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值