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

动态规划经典案例分析之编辑距离

我们先来看题目描述:

给你两个单词word1word2, 请返回将word1转换成word2所使用的最少操作数 。

思路:转换过程中的操作

如果两个单词某个位置的字符相同,可以跳过这一位置,不需要额外的操作。

如果字符不同,则需要进行以下操作之一:

  • 插入一个字符:使 word1 的当前部分匹配 word2 的当前部分。
  • 删除一个字符:使 word1 的当前部分匹配 word2 的当前部分。
  • 替换一个字符:将 word1 的当前字符修改为 word2 的当前字符。

那么,这个时候就得采用动态规划的方式,逐步计算从 word1 的前 i 个字符转换为 word2 的前 j 个字符的最小操作数。

1. 定义

采用二维数组 dp[i][j],它表示将字符串 word1 的前 i 个字符转换为 word2 的前 j 个字符的最少操作数。

2. 初始状态

当 i = 0(即 word1 为空字符串)时,需要插入 j 个字符才能转成 word2 的前 j 个字符,dp[0][j] = j

当 j = 0(即 word2 为空字符串)时,需要删除 i 个字符才能将 word1 变为空字符串dp[i][0] = i

3. 状态转移分析

对于任意 i >0, j > 0 ,则考虑 word1[i-1] 和 word2[j-1] 是否相同

  • 如果相同(word1[i-1] == word2[j-1]):无需操作,结果等于转换前 i-1 个字符和 j-1 个字符的结果。dp[i][j] = dp[i-1][j-1]
  • 如果不同(word1[i-1]! = word2[j-1]):此时就需要选择插入、删除和替换的最优解:

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

dp[i-1][j]:对应删除操作,表示删除word1的当前字符
dp[i][j-1]:对应插入操作,表示在word1的当前追加最后一个字符
dp[i-1][j-1]:对应替换操作,表示将当前字符替换为目标字符。

具体代码如下:

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; 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] = 1 + min({dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]}); } } } return dp[m][n]; }
  • 时间复杂度:O(m*n)
  • 空间复杂度:O(m*n)

好了,本文到这里就结束了,希望认真阅读全文的小伙伴,都能有所收获哦!

http://www.jsqmd.com/news/684217/

相关文章:

  • 2026年3月升降货梯源头厂家推荐,液压货梯/升降平台/升降货梯,升降货梯源头厂家哪家性价比突出 - 品牌推荐师
  • “金三银四”春招大战正酣!2026职场招聘被AI点燃,岗位暴涨12倍,月薪超6万
  • 还在用 Visio 画架构图?这个 AI 神器让你告别手动绘图,5秒出图还能改!
  • 打卡信奥刷题(3150)用C++实现信奥题 P7682 [COCI 2008/2009 #5] TRESNJA
  • 服务型AI设计:从自助陷阱到智能服务革命
  • 2026 热镀锌桥架实测排行:全维度性能解析与工程采购落地指南 - 外贸老黄
  • 竞技性机器学习:核心优势与实战进阶指南
  • LeetCode 2024. 考试的最大困扰度【不定长滑窗】1643
  • 避开STC15定时器的那些坑:从模式选择到中断响应,我的调试笔记
  • 实战解析:基于GD32与ADS1118的高精度数据采集系统搭建
  • 2026 热镀锌桥架综合实力 TOP 测评:全维度品质实测与工程采购实操指南 - 外贸老黄
  • between的用法
  • 单片机控制板基础设计原则
  • 5分钟掌握SMUDebugTool:AMD Ryzen处理器硬件调试实战指南
  • 别再手动复制DLL了!Qt Creator + CMake一键配置OpenCV库(附完整配置流程)
  • LFM2.5-1.2B-Thinking轻量部署:Ollama系统提示词配置,让1.2B小模型发挥大能量
  • [Windows] Mouser v3.5.3第三方罗技鼠标驱动
  • 速看!黄金秘籍解决华为防火墙最困难的故障
  • 新手必看:CTFHub靶场RCE通关保姆级教程(从环境搭建到Flag获取)
  • 2026年AI生成式引擎优化行业梳理:五家值得企业选型参考的AI优化GEO服务商推荐 - 商业小白条
  • 往前走——成为更好的自己
  • 利用云函数做一个钉钉机器人提醒功能教程
  • Qwen3.5-2B赋能前端开发:自动生成JavaScript组件代码与文档
  • RWKV7-1.5B-world保姆级教程:Gradio界面日志导出功能,用于对话质量人工评估
  • 往前走,做更好的自己
  • JetBrains IDE试用期重置终极指南:2026年免费解锁30天完整功能
  • 大一新生组队玩转CUIT智能车:从零到跑完赛道,我们的STM32电磁循迹调车全记录
  • 别再死记硬背命令了!用Conda+Fastp+Bowtie2搞定ATAC-seq上游分析(附完整代码与避坑记录)
  • 【2026最新】英文论文降AI率怎么做?6大主流工具实测盘点,这3个坑千万别踩!
  • ESP32玩转网络转发:除了做中继,你的AP+STA模式还能这样用(附IoT项目思路)