LeetCode 72.编辑距离

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

要解决LeetCode 72题“编辑距离”问题,我们可以使用动态规划的方法。以下是详细的C++解题思路和实现过程:

解题思路

  1. 问题分析
    编辑距离问题要求将字符串 word1 转换为 word2 所需的最少操作次数,允许的操作包括插入、删除和替换字符。动态规划适用于这类具有重叠子问题和最优子结构的问题。

  2. 状态定义
    定义二维数组 dp[i][j],表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最小操作次数。

  3. 状态转移方程

    • 字符匹配:若 word1[i-1] == word2[j-1],则无需操作,直接继承前一步的结果:
      dp[i][j] = dp[i-1][j-1]
    • 字符不匹配:需从插入、删除、替换中选择操作次数最少的一种:
      dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
  4. 初始化

    • dp[i][0] = i:删除 i 个字符使 word1 变空。
    • dp[0][j] = j:插入 j 个字符使空字符串变为 word2 的前 j 个字符。
  5. 填充顺序
    按顺序遍历 i 从 1 到 m,j 从 1 到 n,确保子问题已解决。

三种操作的具体解释

你提到的三种操作对应的状态转移方程理解是正确的,但可能还不够直观。让我们通过具体场景和表格推导来彻底理解这些操作的数学含义,以及为什么最终要取这三个值的最小值。


1、操作的本质与状态转移关系

假设我们有两个字符串:

  • word1 = "abc"(长度 m=3)
  • word2 = "abd"(长度 n=3)

建立二维DP表 dp[4][4](索引从0到3):

i\j0 (空)1 (a)2 (b)3 (d)
00123
1 (a)1???
2 (b)2???
3 ©3???

现在我们要计算 dp[3][3](即 word1[0..2]转成word2[0..2])。


场景1:插入操作(对应 dp[i][j-1] + 1)
  • 当前字符:word1[2] = 'c' vs word2[2] = 'd'
  • 插入操作:在word1末尾插入d,此时word1变为"abcd"
    • 此时word1[3]的d已经匹配word2[2]的d
    • 剩下的问题转化为将word1[0..2](即"abc")转为word2[0..1](即"ab")
    • 这个子问题的解是 dp[3][2]
    • 总操作次数 = dp[3][2] + 1

场景2:删除操作(对应 dp[i-1][j] + 1)
  • 删除操作:删除word1[2]的c,此时word1变为"ab"
    • 剩下的问题是将"ab"转为"abd"
    • 这个子问题的解是 dp[2][3]
    • 总操作次数 = dp[2][3] + 1

场景3:替换操作(对应 dp[i-1][j-1] + 1)
  • 替换操作:将word1[2]的c替换为d
    • 此时word1变为"abd"
    • 剩下的问题是将"ab"转为"ab"
    • 这个子问题的解是 dp[2][2]
    • 总操作次数 = dp[2][2] + 1

2、具体数值推导

假设我们已经计算出前面的值:

i\j0123
00123
11012
22101
3321?

现在计算 dp[3][3]:

  1. 插入:dp[3][2] + 1 = 1 + 1 = 2
  2. 删除:dp[2][3] + 1 = 1 + 1 = 2
  3. 替换:dp[2][2] + 1 = 0 + 1 = 1

最终取最小值 1,即通过替换操作只需1步。


3、为什么取三种操作的最小值?

这三种操作涵盖了所有可能的编辑方式:

  1. 插入:适用于word1比word2短的情况(需要补字符)
  2. 删除:适用于word1比word2长的情况(需要删冗余字符)
  3. 替换:适用于字符不匹配但长度相同的情况

通过动态规划,我们始终选择历史最优解(已计算的子问题最优解)加上当前操作的最小代价。


4、边界条件的深层理解
  • dp[i][0] = i:将长度为i的字符串变为空串,只能删除i次
  • dp[0][j] = j:将空串变为长度为j的字符串,只能插入j次

例如:

  • word1 = "abc", word2 = "" → 需要删除3次
  • word1 = "", word2 = "abc" → 需要插入3次

C++代码实现

#include <vector>
#include <algorithm> // 用于min函数

using namespace std;

int minDistance(string word1, string word2) {
    int m = word1.size(), n = word2.size();
    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
    
    // 初始化边界条件
    for (int i = 0; i <= m; ++i) dp[i][0] = i;
    for (int j = 0; j <= n; ++j) dp[0][j] = j;
    
    // 填充dp数组
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (word1[i-1] == word2[j-1]) {
                dp[i][j] = dp[i-1][j-1];
            } else {
                dp[i][j] = min({ dp[i-1][j], dp[i][j-1], dp[i-1][j-1] }) + 1;
            }
        }
    }
    return dp[m][n];
}

代码解析

  • 时间复杂度:O(m*n),需要遍历二维数组的所有元素。
  • 空间复杂度:O(m*n),用于存储动态规划表。
  • 关键点:
    • 通过比较当前字符是否相等决定操作方式。
    • 使用 min({a, b, c}) 取三者最小值(C++11特性)。
    • 边界条件初始化正确处理空字符串的情况。

示例验证

  • 输入:word1 = "horse", word2 = "ros"
    输出:3
    解释:替换 h→r,删除 r,删除 e,共3步。

  • 输入:word1 = "intention", word2 = "execution"
    输出:5
    解释:通过替换、删除等操作匹配字符串。

(04730)半导体器件之基本放大器工作原理(一) 放大器是构成各种电子线路的基本单元电路。所谓“放大”,就是将输入的微弱信号(微弱变化的电压或电流等)去控制直流电源提供的能量,并使输出按照输入的小信号变化规律而变化的过程。所以放大器的本质是能量转换器。本节重点学习基本放大电路的工作原理和基本分析方法及主要性能指标。 阅读详情

相关推荐

【AAOS】【源码分析】用户管理(五)-- MUMD介绍

MUMD(多用户多屏显示)是Android Automotive OS为车载多乘员场景设计的功能,支持不同座位用户独立操作各自屏幕。

码农的历程 1510

编辑距离(levenshtein distance)C/C++实现

编辑距离(levenshtein distance)C/C++ 实现 Levenshtein distance 距离简介 Levenshtein distance 的由来 Levenshtein Distance,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。levenshtein() 函数返...

calvinpaean的博客 1650

Win上通过Jconsole查看Java程序资源占用情况(教程总结,一篇就够了)

JConsole 是一个内置 Java 性能分析器,Java 5开始 引入了 JConsole。可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole来监控 Java 应用程序性能和跟踪 Java 中的代码。Jconsole工具查看程序的资源占用请求。安装jdk时bin目录有jconsole.exe工具,或者通过 Win + R,输入jconsole.exe启动jconsole( 可以从命令行直接输入jconsole。

明生的博客 6240

Levenshtein Distance(编辑距离)算法C++实现及应用

编辑距离的定义 编辑距离(Edit Distance)最常用的定义就是Levenstein距离,是由俄国科学家Vladimir Levenshtein于1965年提出的,所以编辑距离一般又称Levenshtein距离。它主要作用是测量两个字符串的差异化程度,表示字符串a至少要经过多少个操作才能转换为字符串b,这里的操作包括三种:增加、删除、替换。 举个例子: (1)增加:对于字符串a:abc 和 字符串b:abcde,显然,只需要在字符串a的末尾增加字符'd'和'e'就能变成字符串b了,所以a和b的最短

XJX_ai_dai的博客 6358

用Python和NumPy搞定复合材料层合板ABD矩阵计算(附完整代码与避坑指南)

本文详细介绍了如何使用Python和NumPy高效计算复合材料层合板的ABD刚度矩阵,包括单层板刚度计算、偏轴转换和层合板刚度集成。通过完整的代码示例和工程实践技巧,帮助工程师快速构建定制化分析工具,解决航空航天、汽车制造等领域的复合材料力学性能分析问题。特别提供了避坑指南和性能优化策略,确保计算结果的准确性和效率。

weixin_30752699的博客 277

【硬件设计】_基于STM32单片机的智能台灯系统

智能台灯系统是一款多功能的智能照明设备,能够自动调节亮度、监测人体活动、感知环境光照,并具备定时和报警功能,极大提升了用户体验与功能的灵活性,主要包括以下功能:系统提供自动和手动两种模式以调节台灯亮度。在自动模式下,台灯会根据周围光强智能调整;而在手动模式下,用户可通过按键自行设置亮度。利用红外光电开关检测台灯与用户之间的距离,若距离过近,系统将发出报警提示。通过时钟模块设置定时提醒,并在OLED显示屏上显示当前时间,当达到设定的定时时间时,蜂鸣器将发出报警音。

2401_85381181的博客 1730

编辑距离问题(C++)

一、问题重述 给定字符串A、B,要用最少的字符操作将字符串A变成字符串B。这里所说的字符操作包括: 删除一个字符 插入一个字符 将一个字符改为另一个字符 将字符串A变换为字符串B所用的最少字符操作数成为字符串A到B的编辑距离,现求最小编辑距离。 二、思路分析 设定数组c[ i ][ j ],代表字符串A的前i个字符与字符串B的前j个字符 形成的两个字符串变换所需要的最小编辑距离。 思考...

阳光大男孩!!!的博客 3118

传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集

传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集,数据显示及matlab操作界面。

qq_41958946的博客 7354

蓝桥杯DP专题

线性DP 1.数字三角形 刷题链接: link. 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 输入格式 第一行包含整数n,表示数字三角形的层数。 接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。 输出格式 输出一个整数,表示最大的路径数字和。 数

zx428621的博客 1660

【华为OD机试真题】390、AI面板识别 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >AI识别到面板上有N(1 ≤ N ≤ 100)个指示灯,灯大小一样,任意两个之间无重叠。   由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2,y2),   请输出先行后列排序的指示灯的编号,排序规则:   1、每次在尚未排序的灯中挑选最高的灯作为的基准灯   2、找出和基准灯属于同一行所有的灯进行排序。两个灯高低偏差不超过灯半径算同一行(即两个灯坐标的差 ≤ 灯高度的一半)

KJ.JK 1802

英伟达 Jetson AGX Thor 官方入门教程(二)CUDA、Docker、JetPack 设置

本文详细介绍了NVIDIA Jetson AGX Thor开发套件的安装与配置流程。主要内容包括:1) BSP安装的三种方法(Jetson ISO、SDK Manager和Linux刷写脚本)及其适用场景;2) Docker环境的完整配置步骤及测试方法;3) CUDA工具包的两种安装方式(容器化和原生安装)及其性能对比;4) JetPack SDK的安装选项。文章提供了详细的命令行操作指南和故障排除建议,帮助开发者快速搭建AI开发环境,充分发挥Jetson平台的硬件性能优势。

机器人控制与仿真应用 1731

编辑距离(LeetCode72)---C++实现

先附上LeetCode上此题的OJ网址,有需要可点击直达 一般求最短距离、存在性问题、可能性的总数都要想到动态规划。 思路: 动规核心思想就是空间换时间,用数组存储下之前的信息,计算之后的情况便不需要再重新计算以前的情况了。 这里我们用dp[i][j]表示word1从[0…i - 1]的位置 编辑到word2[0…j - 1]的位置的最短距离(例如对于word1 = “horse”,word2...

qq_42673507的博客 1129

UG NX二次开发(C++)-UIStyler-指定平面的对象和参数获取

在采用NXOpen C++进行二次开发时,采用Menu/UIStyler是一种很常见的方式,这样可以制作精美的界面,而且常用的块对象也集成了快速编程的代码,我们可以快速的利用这些块来定制我们需要的界面。但是,对于很多初学者可能对选择对象的获取不是很熟悉,我们本文以选择“指定平面”来讲一下如何获取选择的对象和对象的参数。另外,由于我们的UG NX二次开发学习讨论群QQ一群已满,有希望参与学习的有志之士加入我们的QQ二群:683566590。

GimiGimmy 1091

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

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

Alex__Mahone的专栏 960

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

Janium的博客 834

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LeetCode 力扣 72. 编辑距离

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

wind_liang的博客 1118

力扣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

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

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

力扣-72-编辑距离

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

lan_jianwen的博客 213

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

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

阿旭的博客 703

Python描述 LeetCode 72. 编辑距离

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

一起加油 829

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
上一篇: 二分答案(进阶)
下一篇: 做的一些题目的答案和自己的一些思考
ByteMaster_
博客等级 码龄3年 328粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值