尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【多维动态规划】LC 72.编辑距离
文章目录前言一、题目1、原题链接2、题目描述二、个人思路整理1、思路分析2、解题代码三、知识风暴前言本专栏文章为《LeetCode 热题 100》的刷题题解相关内容如有侵权立即删除。一、题目1、原题链接72.编辑距离2、题目描述二、个人思路整理1、思路分析核心思路二维动态规划状态定义设dp[i][j]表示将word1的前i个字符即下标0到i - 1转换成word2的前j个字符即下标0到j - 1所需要的最少操作数。状态转移方程考虑word1[i - 1]与word2[j - 1]的匹配情况如果字符相等word1[i - 1] word2[j - 1]当前字符不需要任何额外操作直接继承前一个状态d p [ i ] [ j ] d p [ i − 1 ] [ j − 1 ] dp[i][j] dp[i - 1][j - 1]dp[i][j]dp[i−1][j−1]如果字符不相等word1[i - 1] ! word2[j - 1]可以通过以下三种操作之一完成转换取三者的最小值加 1插入字符在word1末尾插入与word2[j - 1]相同的字符等价于先将word1[0...i-1]变成word2[0...j-2]再插入该字符d p [ i ] [ j − 1 ] 1 dp[i][j - 1] 1dp[i][j−1]1删除字符将word1[i - 1]删掉等价于看word1[0...i-2]变成word2[0...j-1]的代价d p [ i − 1 ] [ j ] 1 dp[i - 1][j] 1dp[i−1][j]1替换字符将word1[i - 1]替换为word2[j - 1]等价于看word1[0...i-2]变成word2[0...j-2]的代价d p [ i − 1 ] [ j − 1 ] 1 dp[i - 1][j - 1] 1dp[i−1][j−1]1综合转移方程d p [ i ] [ j ] min ⁡ ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] , d p [ i − 1 ] [ j − 1 ] ) 1 dp[i][j] \min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) 1dp[i][j]min(dp[i−1][j],dp[i][j−1],dp[i−1][j−1])1边界条件初始化dp[i][0] i当word2为空字符串时需要将word1的前i个字符全部删除代价为i。dp[0][j] j当word1为空字符串时需要插入j个字符变成word2代价为j。2、解题代码classSolution{public:intminDistance(string word1,string word2){intmword1.size();intnword2.size();// dp[i][j] 表示将 word1 的前 i 个字符 word[0...i-1]// 转换成 word2 的前 j 个字符word2[0...j-1]所需的最少操作数vectorvectorintdp(m1,vectorint(n1,0));// 边界条件初始化// 当 word2 为空字符串时需要将 word1 的前 i 个字符全部删除for(inti0;im;i){dp[i][0]i;}// 当 word1 为空字符串时需要插入 j 个字符转成 word2 的前 j 个字符for(intj0;jn;j){dp[0][j]j;}// 状态转移for(inti1;im;i){for(intj1;jn;j){// 如果末尾字符相同则不需要额外操作直接继承前一个状态if(word1[i-1]word2[j-1]){dp[i][j]dp[i-1][j-1];}else{// 若字符不同从三种可能的操作中取最小值并 1// 1. dp[i - 1][j] 1 删除 word1[i-1]// 2. dp[i][j - 1] 1 插入 word2[j-1] 到 word1// 3. dp[i - 1][j - 1] 1 将 word1[i-1] 替换为 word2[j-1]dp[i][j]min({dp[i-1][j]1,dp[i][j-1]1,dp[i-1][j-1]1});}}}// 最终返回 word1 完整转换到 word2 所需的最少操作数returndp[m][n];}};复杂度分析时间复杂度O ( m × n ) O(m \times n)O(m×n)需要遍历填充大小为( m 1 ) × ( n 1 ) (m 1) \times (n 1)(m1)×(n1)的二维表格。空间复杂度O ( m × n ) O(m \times n)O(m×n)。由于每一行只依赖于上一行和当前行的左侧值空间可以进一步优化到O ( n ) O(n)O(n)。三、知识风暴动态规划Dynamic Programming是本题的核心算法思想。它通过将原问题拆解为若干重叠子问题并利用「最优子结构」性质用子问题的最优解递推得到全局最优解。对于「编辑距离」这类求最少操作数的动态规划问题动态规划能以O ( m × n ) O(m \times n)O(m×n)的复杂度高效求解。算法核心思想最优子结构将word1的前i ii个字符转换成word2的前j jj个字符所需的最少操作数可以由「前i − 1 i - 1i−1个字符转前j − 1 j - 1j−1个字符」「前i ii个字符转前j − 1 j - 1j−1个字符」「前i − 1 i - 1i−1个字符转前j jj个字符」三种子问题的结果共同决定。只要子问题d p [ i − 1 ] [ j − 1 ] dp[i - 1][j - 1]dp[i−1][j−1]、d p [ i ] [ j − 1 ] dp[i][j - 1]dp[i][j−1]、d p [ i − 1 ] [ j ] dp[i - 1][j]dp[i−1][j]已知就能递推得到当前位置的最优解。重叠子问题在递推过程中同一个状态d p [ i ] [ j ] dp[i][j]dp[i][j]会被多个后续状态反复引用。例如计算d p [ i 1 ] [ j ] dp[i 1][j]dp[i1][j]、d p [ i ] [ j 1 ] dp[i][j 1]dp[i][j1]与d p [ i 1 ] [ j 1 ] dp[i 1][j 1]dp[i1][j1]时都会访问d p [ i ] [ j ] dp[i][j]dp[i][j]的状态因此用二维表格缓存结果可避免重复计算。与贪心的区别贪心每一步只做当前最优选择、不回溯而动态规划会枚举「插入」「删除」「替换」三种可能的操作来源从而保证结果的正确性。常见对比动态规划 vs 贪心动态规划时间复杂度O ( m × n ) O(m \times n)O(m×n)空间复杂度O ( n ) O(n)O(n)滚动数组优化后。适合需要同时考虑「插入/删除/替换」三种决策、且局部最优不能直接决定全局最优的场景通用性更强。贪心算法时间复杂度O ( m n ) O(m n)O(mn)空间复杂度O ( 1 ) O(1)O(1)。适合每一步的局部最优能直接推导全局最优的场景代码简洁高效但本题中操作选择无法用贪心直接证明例如到达某个字符时贪心只选当前「代价更小」的操作就可能错过最终最优解。共同点两者都依赖「最优子结构」性质。区别在于贪心只保留一个当前最优状态而动态规划需要同时维护「插入」「删除」「替换」三种来源的状态。动态规划的设计思想核心思想把大问题拆成小问题先解决小问题再用小问题的答案拼出大问题的答案。本题中先初始化第一行与第一列对应空串转换的边界情况再逐个字符递推出后续位置的状态。与本题的联系编辑距离问题天然具有递推结构——每个状态d p [ i ] [ j ] dp[i][j]dp[i][j]的最优解都可以由「跳过当前字符」「插入一个字符」「删除一个字符」三种来源共同得到。因此无需回溯或搜索只需按顺序填充二维表格即可。注意事项动态规划的正确性依赖于「最优子结构」与「无后效性」。本题中d p [ i ] [ j ] dp[i][j]dp[i][j]只由d p [ i − 1 ] [ j − 1 ] dp[i - 1][j - 1]dp[i−1][j−1]、d p [ i ] [ j − 1 ] dp[i][j - 1]dp[i][j−1]、d p [ i − 1 ] [ j ] dp[i - 1][j]dp[i−1][j]三个前置状态决定与未来的状态无关因此递推顺序合法。使用要点状态变量dp[i][j]记录将word1的前i ii个字符转换成word2的前j jj个字符所需的最少操作数0 ≤ i ≤ m 0 \le i \le m0≤i≤m0 ≤ j ≤ n 0 \le j \le n0≤j≤n。初始化dp[i][0] i将word1的前i ii个字符全部删除变为空串、dp[0][j] j从空串插入j jj个字符变为word2的前j jj个字符以「空串边界」作为递推基准。转移时机外层循环遍历word1的每个字符i ii内层循环遍历word2的每个字符j jj。若word1[i - 1] word2[j - 1]则直接继承dp[i - 1][j - 1]否则取「删除」「插入」「替换」三种操作的最小值加 1。结果返回遍历结束后返回dp[m][n]表示将完整的word1转换成完整的word2所需的最少操作数。算法变体与扩展不同的子序列LeetCode 115将「最少操作数」改为「不同转换方式的数量」状态转移方程由取最小值改为累加与本题的递推结构高度相似。两个字符串的删除操作LeetCode 583只允许「删除」操作不允许「插入」与「替换」是本题的一种简化变体。最长公共子序列LeetCode 1143与编辑距离同属「双串动态规划」经典题目通过维护两个字符串的前缀状态来刻画匹配关系。正则表达式匹配LeetCode 10在编辑距离基础上引入「通配符」约束需要同时考虑「匹配」「跳过」等多种情形。相关 LeetCode 例题115. 不同的子序列双串 计数583. 两个字符串的删除操作双串 删除1143. 最长公共子序列双串 匹配10. 正则表达式匹配双串 通配符
RELATED

相关推荐

Ant Design Blazor 条形图(Bar)组件实战指南:从基础条形图到分组、堆叠与区间图表

Ant Design Blazor 条形图(Bar)组件实战指南:从基础条形图到分组、堆叠与区间图表

前端UI组件设计系统 【免费下载链接】ant-design-blazor 基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力,实现更大价值。 项目地址: https://gitcode.com/ant-design-blazor/ant-design-blazor 点击查看 免费下载 Ant Design Blazor 图表…

📅 2026/10/10 11:26:08
Ferret 开发工作流完全指南:构建、生成、测试、静态检查与基准测试入口全解析

Ferret 开发工作流完全指南:构建、生成、测试、静态检查与基准测试入口全解析

网页爬虫后端开发工具 【免费下载链接】ferret Declarative data automation language and Go runtime for structured extraction workflows. 项目地址: https://gitcode.com/gh_mirrors/fe/ferret 点击查看 免费下载 导读 本文基于 Ferret(声明式数据…

📅 2026/10/10 11:26:08
【孩子不想跟你说话?】用“智在记录”AI笔记,重建亲子深度沟通

【孩子不想跟你说话?】用“智在记录”AI笔记,重建亲子深度沟通

开篇:为什么你越问,孩子越沉默?“今天在学校怎么样?” “还行。” “老师讲什么了?” “没什么。”很多家长都经历过这种“对话死胡同”。你明明想了解孩子的世界,但每次沟通都像在挤牙膏——孩子不配合、话…

📅 2026/10/10 11:26:08
MORE NEWS

更多资讯

📰

通达信公式编写核心原理与四大类型避坑指南

简介:本资源是一份面向股票量化分析初学者与通达信用户的技术指标开发入门教程,系统讲解如何在通达信平台编写四类核心公式:技术指标(如MA、KDJ)、条件选股(如“股价低于每股净资产”)、交易系统…

📰

生产级 SKILL.md 的 7 条铁律:从 Cloudflare 文档 Linter 到 replica-skill 的共性

生产级 SKILL.md 的 7 条铁律:从 Cloudflare 文档 Linter 到 replica-skill 的共性 【免费下载链接】replica-skill Eleven free Claude skills that clone any app: reverse-engineer it, rebuild it, test it for bugs, then fix what its users hate. Free, MIT.…

📰

Harness 工程安全基线:为 AI Agent 编写 SECURITY.md 安全策略文件

【免费下载链接】learn-harness-engineering Harness engineering beginner tutorial, from 0 to 1 项目地址: https://gitcode.com/gh_mirrors/le/learn-harness-engineering 点击查看 免费下载 SECURITY.md 是面向 Agent 的仓库(agent-first reposito…

📰

ponyc 0.57.1 修复 x86 macOS 上 Xcode 15 链接 Pony 程序失败问题解析

编程语言编译器语言运行时 【免费下载链接】ponyc Pony is an open-source, actor-model, capabilities-secure, high performance programming language 项目地址: https://gitcode.com/gh_mirrors/po/ponyc 点击查看 免费下载 导读 ponyc 0.57.1 是一次聚焦单一…

📰

LeetCode 139 单词拆分全解析:动态规划、剪枝优化与 Trie 加速

刷 LeetCode 的人,几乎都会被一道叫“单词拆分”的题拦住过。它排在热门 100 题的中段,题干看起来非常简单:给一个字符串和一个字典,问这个字符串能不能被字典里的单词完整拼出来。但第一次动手写的时候,很容易在贪心、…

📰

FDE方法卡:用三张卡化解工程前期需求沟通偏差

在工程圈里摸爬滚打久了,你会发现一个特别普遍的现象:大部分项目最后出问题,不是死在技术难点上,而是死在前期的“我以为”上。需求方以为自己说清楚了,执行方以为自己听懂了,等东西做出来摆到台面上&#…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬