news 2026/7/27 2:13:14

动态规划解法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态规划解法

一、动态规划解编辑距离的核心原理

编辑距离(Levenshtein 距离)的动态规划解法核心是用二维数组存储子问题的解,避免递归的重复计算,其核心逻辑基于:

  • 定义dp[i][j]:表示将word1的前i个字符转换成word2的前j个字符所需的最少操作次数
  • 边界条件:
    • dp[i][0] = i:把word1i个字符转成空字符串,需要删除i次;
    • dp[0][j] = j:把空字符串转成word2j个字符,需要插入j次。
  • 状态转移:
    • 如果word1[i-1] == word2[j-1](当前字符相等):无需操作,dp[i][j] = dp[i-1][j-1]
    • 如果word1[i-1] != word2[j-1](当前字符不等):取「删除、插入、替换」三种操作的最小值 + 1,即:dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1

二、动态规划解法代码逐行解析

下面针对dpEditDistance函数逐行拆解,帮你理解每一步的作用:

int dpEditDistance(string& word1, string& word2) { // 1. 获取两个字符串的长度(m=word1长度,n=word2长度) int m = word1.size(), n = word2.size(); // 2. 定义DP表:静态二维数组,大小(MAX_LEN+1)x(MAX_LEN+1) // 为什么+1?因为dp[i][j]对应前i/j个字符,需要包含i=0/j=0的边界情况 int dp[MAX_LEN + 1][MAX_LEN + 1]; // 3. 初始化边界条件(核心!) // 边界1:word2为空,word1前i个字符转空需要删除i次 for (int i = 0; i <= m; ++i) dp[i][0] = i; // 边界2:word1为空,空字符串转word2前j个字符需要插入j次 for (int j = 0; j <= n; ++j) dp[0][j] = j; // 4. 填充DP表(核心状态转移) // 遍历word1的每个字符(i从1到m,对应前i个字符) for (int i = 1; i <= m; ++i) { // 遍历word2的每个字符(j从1到n,对应前j个字符) for (int j = 1; j <= n; ++j) { // 情况1:当前字符相等(word1[i-1]是第i个字符,因为数组从0开始) if (word1[i - 1] == word2[j - 1]) { // 无需操作,直接继承前i-1和j-1的结果 dp[i][j] = dp[i - 1][j - 1]; } else { // 情况2:当前字符不等,取三种操作的最小值+1 // dp[i-1][j]:删除word1第i个字符(操作数+1) // dp[i][j-1]:给word1插入word2第j个字符(操作数+1) // dp[i-1][j-1]:替换word1第i个字符为word2第j个字符(操作数+1) dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1; } } } // 5. 返回最终结果:word1全量转word2全量的最少操作次数 return dp[m][n]; }

三、实际执行示例(以 "horse"→"ros" 为例)

我们用代码中的测试用例word1="horse"(m=5)、word2="ros"(n=3),看 DP 表的填充过程:

步骤 1:初始化边界
i\j0 (空)1 (r)2 (ro)3 (ros)
00123
11
22
33
44
55
步骤 2:填充 DP 表(关键节点)
  • i=1 (h)j=1 (r)h≠rmin(dp[0][1], dp[1][0], dp[0][0])+1 = min(1,1,0)+1=1dp[1][1]=1
  • i=3 (r)j=1 (r)r=rdp[3][1] = dp[2][0] = 2
  • i=5 (e)j=3 (s)e≠smin(dp[4][3], dp[5][2], dp[4][2])+1→ 最终dp[5][3]=3(和代码输出一致)。

最终结果dp[5][3]=3,表示 "horse" 转 "ros" 最少需要 3 次操作(删除 h、删除 e、替换 s→e,或其他等价操作)。

四、动态规划解法的优化点(可选)

你提供的代码用了静态二维数组,虽然简单但有优化空间,适合新手进阶:

空间优化(一维数组):观察状态转移可知,dp[i][j]只依赖dp[i-1][j]dp[i][j-1]dp[i-1][j-1],因此可以用一维数组代替二维数组,空间复杂度从O(m∗n)降到O(min(m,n)):

int dpEditDistanceOpt(string& word1, string& word2) { int m = word1.size(), n = word2.size(); // 用一维数组,长度为较短字符串+1 if (m < n) return dpEditDistanceOpt(word2, word1); int dp[n + 1]; // 初始化边界 for (int j = 0; j <= n; ++j) dp[j] = j; // 填充一维DP for (int i = 1; i <= m; ++i) { int prev = dp[0]; // 保存dp[i-1][j-1]的值 dp[0] = i; // 对应dp[i][0] = i for (int j = 1; j <= n; ++j) { int temp = dp[j]; // 保存当前dp[j](即dp[i-1][j]) if (word1[i-1] == word2[j-1]) { dp[j] = prev; } else { dp[j] = min(min(dp[j], dp[j-1]), prev) + 1; } prev = temp; // 更新prev为下一轮的dp[i-1][j-1] } } return dp[n]; }

总结

动态规划解法的核心要点:

  1. dp[i][j]定义为「word1 前 i 个字符转 word2 前 j 个字符的最少操作数」,是整个解法的基础;

  2. 边界条件处理空字符串的特殊情况,状态转移覆盖「删除、插入、替换」三种操作;
  3. 相比纯递归,动态规划通过迭代填充 DP 表,时间复杂度O(m∗n),无重复计算;相比记忆化递归,无需递归调用栈,效率更高。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/25 23:42:01

力扣 11.盛最多水的容器 简单的双指针算法 题解

题目描述给定一个长度为 n 的整数数组 a 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, a[i]) 。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。​ 输出容器可以储存的最大水量。**说明&#xff1a;**你不能倾斜容器。输入格式…

作者头像 李华
网站建设 2026/7/26 15:29:02

深度学习驱动的论文降重工具有效规避查重风险,智能改写段落

AI工具能否有效解决数学建模论文复现与排版难题&#xff1f;本文深度评测10款热门AI论文写作工具&#xff0c;助你快速找到高效助手&#xff0c;轻松应对时间紧、任务重的学术挑战。aibiye&#xff1a;专注于语法润色与结构优化&#xff0c;提升可读性aicheck&#xff1a;一键生…

作者头像 李华
网站建设 2026/7/22 4:02:35

温度传感器PT1000与NTC10K介绍

在模拟电路的温度测量领域&#xff0c;PT1000和NTC 10K是两种最常用的温度敏感元件。它们基于不同的物理原理&#xff0c;各有独特的特性、应用场景和设计考量。一、PT1000&#xff08;铂电阻温度传感器&#xff09;1、基本介绍PT1000是一种正温度系数&#xff08;PTC&#xff…

作者头像 李华
网站建设 2026/7/23 22:50:39

震惊!这家酶制剂供应商竟让行业炸锅

震惊&#xff01;这家酶制剂供应商竟让行业炸锅&#xff1a;深度解析上海华上翔洋的创新之道在生物技术与工业制造深度融合的今天&#xff0c;酶制剂作为关键的生物催化剂&#xff0c;其性能与供应稳定性直接关系到下游食品、饲料、纺织、能源等诸多行业的革新进程。近期&#…

作者头像 李华
网站建设 2026/7/25 7:15:44

数学建模与排版无忧?这10个AI论文工具精准解决复现难题

还在为论文写作头痛&#xff1f;特别是数学建模的优秀论文复现与排版&#xff0c;时间紧、任务重&#xff0c;AI工具能帮上大忙吗&#xff1f;今天&#xff0c;我们评测10款热门AI论文写作工具&#xff0c;帮你精准筛选最适合的助手。aibiye&#xff1a;专注于语法润色与结构优…

作者头像 李华
网站建设 2026/7/23 18:18:33

AI对打工人的三个影响

2022年底AI爆火&#xff0c;不过三年时间&#xff0c;说长不长说短不短&#xff0c;大模型就从玩具&#xff0c;上升到助手的地位。爆火刚满三年&#xff0c;已经"初具人形"。互联网的企业和民工&#xff0c;不会错过颠覆性的技术变革&#xff0c;门槛高无法直接参与…

作者头像 李华