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

力扣HOT100(55)多维动态规划 - 编辑距离

动态规划核心思路

dp 定义(和 LCS 完全一样)

dp[i][j]把 word1 的前 i 个字符,转换成 word2 的前 j 个字符,所需的最少操作次数

边界条件(空串情况)

  • 如果word1是空串(i=0):转换成word2前 j 个字符,需要插入 j 次dp[0][j] = j
  • 如果word2是空串(j=0):转换成空串,需要删除 i 次dp[i][0] = i

状态转移方程(核心,分两种情况)

情况 1:c1 == c2(最后一个字符相同)

这两个字符已经匹配了,不需要任何操作,直接继承前面的结果:

plaintext

dp[i][j] = dp[i-1][j-1]

比如:word1="abc"word2="adc",最后一个字符都是 c,那么只需要把 "ab" 转换成 "ad" 就行。

情况 2:c1 != c2(最后一个字符不同)

有三种操作可以选,选操作次数最少的那个,再加 1(当前这次操作):

  1. 删除 word1 的最后一个字符:把word1前 i-1 个转换成word2前 j 个,再删最后一个 →dp[i-1][j] + 1
  2. 插入一个字符到 word1 末尾:插入的字符正好是c2,所以只需要把word1前 i 个转换成word2前 j-1 个 →dp[i][j-1] + 1
  3. 替换 word1 的最后一个字符:把c1换成c2,然后把word1前 i-1 个转换成word2前 j-1 个 →dp[i-1][j-1] + 1

所以:

plaintext

dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1

四、完整解题步骤

  1. 处理边界情况:如果其中一个字符串为空,直接返回另一个字符串的长度
  2. 初始化 dp 数组
    • 大小为(n+1) × (m+1),n 是 word1 长度,m 是 word2 长度
    • 第一行:dp[0][j] = j
    • 第一列:dp[i][0] = i
  3. 遍历计算 dp 数组
    • 外层循环:i 从 1 到 n
    • 内层循环:j 从 1 到 m
      • 如果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[n][m]
class Solution { public: int minDistance(string word1, string word2) { int n = word1.size(); int m = word2.size(); //边界情况 有一个是空串 直接返回另一个长度 if(n * m == 0){ return n + m; } //初始化dp数组:n+1行 m+1列 vector<vector<int>> dp(n+1,vector<int>(m+1)); //dp[i][j] 表示word1的前i个和word2前j个 需要将word1转换为word2 //初始化第一列:d[i][0] 这种情况就是删除i 所以就是i次 for(int i = 0;i<=n;i++){ dp[i][0] = i; } //初始化第一行 for(int j = 0;j<=m;j++){ dp[0][j] = j; } //遍历计算dp数组 for(int i = 1;i<=n;i++){ for(int j = 1;j<=m;j++){ if(word1[i-1] == word2[j-1]){//如果第i个和第j个相等说明这个元素不用改,所以改动的次数和前i-1个一样 如下: dp[i][j] = dp[i-1][j-1]; } else{ //如果最后一个不一样 有三种操作:删 添加 替代 //前i-1个和那边的前j个相同 然后删掉word1的最后一个 int del = dp[i-1][j] +1; //前i个和那边的前j-1个相同 然后插入word2的最后一个 int ins = dp[i][j-1] +1; //前i-1和那边的前j-1相同 然后word1的最后一个替换成word2中的最后一个 int rep = dp[i-1][j-1] +1; dp[i][j] = min(del,min(ins,rep)); } } } return dp[n][m]; } };
http://www.zskr.cn/news/1475313.html

相关文章:

  • 如何在本地构建千万级图片搜索引擎:ImageSearch实战指南
  • OpenAI Codex 使用指南:程序员进入 AI Agent 编程时代
  • 如何选择远心镜头内同轴光源和外同轴光源
  • GHelper终极指南:华硕笔记本轻量级控制神器,告别Armoury Crate卡顿烦恼
  • 3分钟快速制作专业MDX词典:AutoMdxBuilder完全指南
  • 5分钟搞定百度网盘批量转存:免费开源神器BaiduPanFilesTransfers终极指南
  • ROG携20周年纪念设计电竞显示器亮相2026台北电脑展!
  • Token消耗量翻10倍才算企业转型及格线?三位产业一线大佬教你用出性价比
  • 高速差分接口互连实战:LVPECL、CML、LVDS电平匹配与终端设计
  • 如何用BilibiliDown轻松下载B站视频:跨平台视频下载器完全指南
  • WrenAI容器化实践:构建企业级AI数据上下文层
  • AI智能体的分类及开发
  • 2026年6月光固化保护套生产厂家选哪家,环氧酚醛/环氧玻璃钢/石墨烯涂料/光固化保护套,光固化保护套批发厂家找哪家 - 品牌推荐师
  • 2026散热风扇实力之选:卡固、台湾维宏、SUNON、台达、ADDA等品牌企业综合能力评估 - 品牌企业推荐师(官方)
  • 2026精选:上海无损检测与材料检测服务公司——专业精准与深度技术解析 - 品牌企业推荐师(官方)
  • Hello, Wilds!
  • 不暴露身份随便聊|2026树洞公众号排行:树洞陪聊+倾诉+陪玩TOP5 - 时时资讯
  • HarmonyOS认证体系解析:应用与设备开发双路径赋能开发者生态
  • 2026黄金变现新选择!沈阳TOP级回收,收的顶凭诚信靠谱稳占榜首 - 奢侈品回收评测
  • 89C51单片机驱动12864液晶屏:从硬件接口到字符显示的完整实现
  • 2026人体工学椅主流厂家企业发展现状分析(附核心数据) - 多才菠萝
  • BM 算法详解:只需这一篇文章,从零开始掌握高效的字符串匹配
  • 从1500W LED旧闻探秘大功率半导体照明技术真相
  • 2026年程序员办公椅生产企业发展现状分析(附核心数据) - 多才菠萝
  • 告别繁琐配置:用快马平台实现云代码开发的效率倍增
  • 2026甄选:佛山奢侈品回收领域值得信赖的专业机构深度分析 - 品牌企业推荐师(官方)
  • 钢结构的温度荷载(预应力)
  • 2026沈阳黄金回收水深!5家门店实测曝光,正规变现渠道终于摸清 - 奢侈品回收评测
  • 2026 北京海淀区、密云区黄金回收|合扬权威鉴定,黄金回收更规范 - 奢侈品交易观察员
  • 嘉兴市有哪些官方授权的CPPM注册职业采购经理培训机构? - 众智商学院课程中心