news 2026/4/18 3:40:06

动态规划解决最小编辑距离问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态规划解决最小编辑距离问题

在自然语言处理的拼写检查、生物信息学的DNA序列相似度比对等场景中,最小编辑距离是衡量两个字符串差异程度的核心指标。它表示将一个字符串通过插入、删除、替换单个字符的操作,转换成另一个字符串所需的最少操作次数。本文将基于动态规划思想,采用静态二维数组实现DP表的方式,详细讲解最小编辑距离问题的求解过程,并附上完整可运行的C++代码。

一、最小编辑距离的动态规划思路

1. 状态定义

设两个字符串分别为 word1 (长度为 m )和 word2 (长度为 n ),定义 dp[i][j] 表示将 word1 的前 i 个字符转换成 word2 的前 j 个字符所需的最小编辑次数。

2. 边界初始化

- 当 i=0 时, word1 为空字符串,转换成 word2 的前 j 个字符需要j次插入操作,即 dp[0][j] = j 。

- 当 j=0 时, word2 为空字符串,转换成 word1 的前 i 个字符需要i次删除操作,即 dp[i][0] = i 。

3. 状态转移方程

对于 word1[i-1] 和 word2[j-1] (字符串下标从0开始,DP表下标从1开始):

- 若 word1[i-1] == word2[j-1] :无需任何操作, dp[i][j] = dp[i-1][j-1] 。

- 若 word1[i-1] != word2[j-1] :取删除( dp[i-1][j] )、插入( dp[i][j-1] )、替换( dp[i-1][j-1] )三种操作的最小次数,再加1次当前操作,即 dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1 。

二、静态二维数组实现代码

采用静态二维数组实现DP表,需提前定义数组的最大长度(如 MAX_LEN ),适用于字符串长度固定且已知的场景,内存分配更高效。

cpp

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

// 定义字符串的最大长度,可根据实际需求调整

const int MAX_LEN = 1000;

// 动态规划求解最小编辑距离(静态二维数组实现DP表)

int dpEditDistance(string& word1, string& word2) {

int m = word1.size(), n = word2.size();

// 静态二维数组作为DP表,存储子问题的解

int dp[MAX_LEN + 1][MAX_LEN + 1];

// 初始化边界:word1为空时,插入j个字符得到word2前j个字符

for (int i = 0; i <= m; ++i) dp[i][0] = i;

// 初始化边界:word2为空时,删除i个字符得到word1前i个字符

for (int j = 0; j <= n; ++j) dp[0][j] = j;

// 填充DP表,求解所有子问题

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 {

// 字符不等,取删除、插入、替换的最小操作数+1

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

}

}

}

// dp[m][n]即为整个问题的解

return dp[m][n];

}

// 测试示例

int main() {

string word1 = "kitten";

string word2 = "sitting";

cout << "最小编辑距离:" << dpEditDistance(word1, word2) << endl;

// 输出结果:3(kitten→sitten→sittin→sitting,共3次操作)

word1 = "intention";

word2 = "execution";

cout << "最小编辑距离:" << dpEditDistance(word1, word2) << endl;

// 输出结果:5

return 0;

}

三、代码解析与测试结果

1. 静态数组优势:静态二维数组在栈上分配内存,访问速度比动态分配的二维数组/vector更快,适合字符串长度可控的场景。

2. 时间复杂度:两层循环遍历 m*n 个状态,时间复杂度为O(mn)。

3. 空间复杂度:静态二维数组占用(MAX_LEN+1) \times (MAX_LEN+1)的空间,空间复杂度为O(MAX\_LEN^2)。

4. 测试结果:

- 字符串 kitten 和 sitting 的最小编辑距离为3;

- 字符串 intention 和 execution 的最小编辑距离为5,与理论结果一致。

四、方法优劣分析

优点

- 实现简单直观,静态数组的内存访问效率高;

- DP表完整存储了所有子问题的解,可回溯查看具体的编辑操作路径。

缺点

- 静态数组的最大长度需提前定义,灵活性不足,若字符串长度超过 MAX_LEN 会导致数组越界;

- 空间开销固定,即使处理短字符串,也会占用 MAX_LEN^2 的内存。

五、拓展方向

若需要优化空间复杂度,可将二维DP表压缩为一维数组(仅保留当前行和上一行),将空间复杂度降至O(min(m,n));若需处理超长字符串,可改用动态二维数组或 vector 实现,避免静态数组的长度限制。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 2:20:21

python django flask考研互助交流平台_c62p51fu--论文

文章目录 系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统截图 python django flask考研互助交流平台_c62p51fu–论文 项目技术简介 Python版本&#xff1…

作者头像 李华
网站建设 2026/4/18 4:00:12

小红书玫瑰克隆工具卡密购买

小红书目前流量非常大&#xff0c;适合商家去上面种草&#xff0c;且可以大量的发布笔记来获得流量&#xff01; 目前比较流行的小红书玫瑰克隆工具就是专门针对小红书笔记进行优化发布的一款实用型工具&#xff01; 很多小伙伴下载了软件&#xff0c;不知道在哪里充值购买卡…

作者头像 李华
网站建设 2026/4/18 1:06:38

熬夜刷手机不愿睡觉,这是一种心理问题吗?

熬夜刷手机&#xff0c;不愿睡觉 &#xff0c;这是一种“报复性睡前拖延” 你也是熬夜刷手机&#xff0c;不愿睡觉吗&#xff1f;其实这是一种 “报复性睡前拖延”心理&#xff1a;用剥夺睡眠来弥补白天被剥夺的自由感。 “白天不属于自己&#xff0c;于是深夜疯狂刷手机。…

作者头像 李华
网站建设 2026/4/18 4:02:03

基于SpringBoot+Vue的乡镇农村建设用地管理系统的设计与实现

前言 &#x1f31e;博主介绍&#xff1a;✌CSDN特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发、文档编写、答疑辅导等。✌…

作者头像 李华
网站建设 2026/4/18 4:04:58

解析:One-API 与 New-API 核心原理

One-API 与 New-API 都是用于统一管理和分发大模型API的工具&#xff0c;但其设计理念、核心架构和功能侧重点存在显著差异。下面将详细解析它们的工作原理&#xff0c;并进行对比。一、One-API 的工作原理One-API 的工作原理可以概括为&#xff1a;作为一个统一的API网关&…

作者头像 李华
网站建设 2026/4/17 5:40:46

【MongoDB实战】第10章 新手避坑指南:90%的人都会踩的错误

文章目录 《MongoDB实战入门》第10章 新手避坑指南:90%的人都会踩的错误 10.1 连接与配置类错误 10.1.1 连接字符串配置错误 错误场景与实战示例 正确配置与实战代码 标准连接字符串格式 正确实操代码(Python驱动) 10.1.2 服务启动失败 场景1:端口占用 排查与解决实战 场景…

作者头像 李华