当前位置: 首页 > news >正文

【Hot 100 刷题计划】 LeetCode 72. 编辑距离 | C++ 经典 DP 增删改状态转移

LeetCode 72. 编辑距离

📌 题目描述

题目级别:困难 (大厂极高频)

给你两个单词word1word2, 请返回将word1转换成word2所使用的最少操作数 。
你可以对一个单词进行如下三种操作:

  1. 插入一个字符
  2. 删除一个字符
  3. 替换一个字符
  • 示例 1:
    输入:word1 = "horse",word2 = "ros"
    输出:3
    解释:
    horse -> rorse (将 ‘h’ 替换为 ‘r’)
    rorse -> rose (删除 ‘r’)
    rose -> ros (删除 ‘e’)

💡 破题思路:二维动态规划

编辑距离是字符串 DP 的终极 Boss,但只要拆解开它的状态转移,逻辑其实非常清晰。

状态定义:
定义f[i][j]表示:将word1的前i个字符转换成word2的前j个字符所需要的最少操作步数。

状态转移推导:
当我们考察word1的第i个字符和word2的第j个字符时,我们有三种基础操作路线:

  1. 删除:假设我们已经把word1的前i-1个字符变成了word2的前j个字符,那么我们只需要把word1多出来的第i个字符删除即可。代价:f[i - 1][j] + 1
  2. 插入:假设我们已经把word1的前i个字符变成了word2的前j-1个字符,那么我们只需要再插入一个word2的第j个字符即可。代价:f[i][j - 1] + 1
  3. 替换/跳过:假设我们已经把word1的前i-1变成了word2的前j-1
    • 如果当前字符相等(word1[i] == word2[j]),不需要操作,直接跳过。代价:f[i - 1][j - 1] + 0
    • 如果当前字符不等,我们需要做替换操作。代价:f[i - 1][j - 1] + 1

我们取这三条路线中的最小值即可!

本解法高光点(哨兵技巧与边界处理):
代码中使用了word1 = " " + word1;加入空格哨兵,让真实字符从下标1开始,完美避免了i-1越界。
同时,必须正确初始化边界:

  • f[i][0] = i:把长度为i的字符串变成空串,必须删除i次。
  • f[0][j] = j:把空串变成长度为j的字符串,必须插入j次。

💻 C++ 代码实现 (标准二维 DP)

classSolution{public:intminDistance(string word1,string word2){intm=word1.size(),n=word2.size();// 极客技巧:头部垫一个空格,让后续有效字符下标从 1 开始word1=" "+word1;word2=" "+word2;intf[m+10][n+10];// 初始化为一个较大值memset(f,0x3f3f3f3f,sizeoff);// 边界初始化极其重要!// word1 的前 i 个字符变为空串,需要删除 i 次for(inti=0;i<=m;i++)f[i][0]=i;// 空串变成 word2 的前 j 个字符,需要插入 j 次for(intj=0;j<=n;j++)f[0][j]=j;// 遍历填写二维表格for(inti=1;i<=m;i++){for(intj=1;j<=n;j++){// 路线 1 & 2:从上方下来(删除),或从左方过来(插入)f[i][j]=min(f[i-1][j],f[i][j-1])+1;// 路线 3:从左上角过来(替换或直接匹配跳过)// 因为前面垫了空格,这里的下标直接用 i 和 jintcost=(word1[i]==word2[j]?0:1);f[i][j]=min(f[i][j],f[i-1][j-1]+cost);}}returnf[m][n];}};
http://www.cnnetsun.cn/news/1929906.html

相关文章:

  • 终极Windows PDF处理方案:Poppler预编译包完整指南
  • 5G入网第一步:手把手拆解PBCH信道里的MIB消息(附LTE/NR对比)
  • Oracle EBS 自然科目段设计方案 + SAP 与 EBS 科目映射对照表
  • 基于STM32F103的3.6kW全桥逆变器资料集:并网充电放电、自动切换及全方位保护
  • AI电商详情页生成落地指南(SITS2026内部验证版):5类高危失效场景+4个不可绕过的合规校验点
  • 从CTF题目到实战:UPX脱壳中的OEP定位技巧与经验分享
  • python中海龟绘图之海龟印章
  • 告别版本不兼容!用Python脚本+ArcGIS工具箱,5分钟搞定上百个mxd文件批量降级
  • FigmaToCode终极指南:如何5分钟将设计稿转换为多平台代码
  • 别再只用SELECT了!解锁MySQL Handler接口,像操作文件一样‘打开-读取-关闭’数据表
  • MyBatis 面试连环炮:从源码原理到实战避坑,彻底拿下 Offer 通关秘籍
  • 如何在Navicat中使用逻辑模型转为物理模型_架构师必备技能
  • 深度学习基于YOLOv8的苹果叶片病害检测系统 Python + PyQt5可视化界面 苹果病害检测数据集的训练及应用
  • UVM验证平台组件通信避坑指南:从TLM端口连接到uvm_config_db的正确用法
  • 用立创EDA复刻FM5324GA充放电模块,做个雪花灯底座给娃当礼物(附完整BOM清单)
  • 有机化学中苯环上取代基的次序规则
  • 手把手教你用STM32F103C8T6和MAX30102做个心率血氧仪(附完整代码和算法解析)
  • 如何用UABEA轻松修改Unity游戏资源?新手完整指南
  • 生成式AI多语言支持实战手册(覆盖127种语系+低资源语言破局方案)
  • vSphere 6.7证书突然过期,凌晨三点我这样救活了vCenter
  • 工业肌肉:04 机器人为什么能精准到 0.01mm?运动控制三参数告诉你
  • 告别环境配置噩梦:用PothosSDR 2020.01.26一站式搞定Windows下的USRP开发环境
  • 步进电机选型翻车实录:从振动、丢步到扭矩不足,我的三个项目踩坑总结与避坑指南
  • PyTorch加载.pth文件报错?手把手教你三种离线下载预训练模型的方法(附国内网络解决方案)
  • LangChain API 参考文档简介
  • FanControl终极指南:5分钟掌握Windows风扇精准控制
  • 【学习笔记】Spring IOC为何重要?
  • 八大网盘直链下载助手:免费开源工具实现下载速度10倍提升
  • Linux C编程基础知识(文件目录操作)
  • FaceFusion使用技巧:如何设置参数获得最佳换脸效果?