当前位置: 首页 > 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.jsqmd.com/news/963618/

相关文章:

  • 三步快速上手:如何轻松搭建专业级H5可视化编辑器
  • 2026年工业搅拌机实力生产厂家甄选:电池材料/化工/砂浆/粉体搅拌机制造商及高效盘条式、无重力混合机专业企业解析 - 品牌企业推荐师(官方)
  • 2026年,Claude Code 凭什么成了程序员的第一终端?深度拆解 Anthropic 的 Agentic 编程革命
  • 夸克网盘批量管理终极指南:3分钟掌握高效文件处理技巧
  • 基于BRF6150与TLV320AIC23B的蓝牙耳机系统设计与VxWorks协议栈实现
  • lodash 数组的常用做法
  • 一键备份你的QQ空间青春记忆:GetQzonehistory完整导出工具指南
  • QT自定义控件之热换站远程监控系统
  • 如何在本地构建千万级图片搜索引擎:ImageSearch实战指南
  • 哈夫曼树的简单介绍
  • 如何选择远心镜头内同轴光源和外同轴光源
  • OpenAI Codex 使用指南:程序员进入 AI Agent 编程时代
  • 2026实测南京黄金回收市场,禹竞深耕本地多年,口碑和实力双在线 - 奢侈品交易观察员
  • 福象商标宝 AI 综合型商标交易平台能力观察:从资质合规到授权过户全解析 - 资讯速览
  • 西门子博图比较指令的‘隐藏’技巧与常见坑点:从数据类型匹配到VARIANT使用避坑指南
  • 沈阳购宠全攻略|东北严寒大风气候避坑指南 + 伴西西浑南、沈河双直营店精选 5 家正规门店 - 资讯速览
  • GHelper终极指南:华硕笔记本轻量级控制神器,告别Armoury Crate卡顿烦恼
  • D2DX宽屏补丁:让暗黑破坏神2在现代PC上完美运行的终极指南
  • 高性价比一键生成论文工具势力榜(2026 实测推荐)
  • 大模型“睡眠”机制:提升推理能力,训练成本却线性增长?
  • 5分钟搞定百度网盘批量转存:免费开源神器BaiduPanFilesTransfers终极指南
  • 全国染料厂主要分布在哪些地区?产区分布与产能观察
  • 3分钟快速制作专业MDX词典:AutoMdxBuilder完全指南
  • 紧急通知:CSDN 2024Q3起强制启用「优质内容优先分发」新策略(附老作者迁移避坑清单)
  • 双51内核MCU通用实验板设计:兼容AT89S51与STC89C51的硬件平台
  • Vim 实战:在 VS Code、JetBrains、终端里玩转 Vim
  • API 签名防重放机制:基于 HMAC-SHA256 的设计与实现
  • ROG携20周年纪念设计电竞显示器亮相2026台北电脑展!
  • 手把手教你用ESP8266+Arduino+PubSubClient库,5分钟搞定OneNet旧版MQTT接入(附完整代码)
  • 新手福音:用快马AI一键生成你的第一个cc switch下载工具