AcWing 902. 最短编辑距离
. 最短编辑距离
一、题目描述
给定两个字符串 和 ,现在要将 经过若干操作变为 ,可进行的操作有:
- 删除–将字符串 中的某个字符删除。
- 插入–在字符串 的某个位置插入某个字符。
- 替换–将字符串 中的某个字符替换为另一个字符。
现在请你求出,将 变为 至少需要进行多少次操作。
输入格式
第一行包含整数 ,表示字符串 的长度。
第二行包含一个长度为 的字符串 。
第三行包含整数 ,表示字符串 的长度。
第四行包含一个长度为 的字符串 B。
字符串中均只包含大小写字母。
输出格式
输出一个整数,表示最少操作次数。
数据范围
输入样例:
10
AGTCTGACGC
11
AGTAAGTAGGC
输出样例:
4
二、解题思路
与(最长公共子序列)问题的状态表示是很接近的。
状态表示
:变成的操作步数。
现在要求的是:两个字符串的最短编辑距离,由于我们不知道最短编辑距离是多少,就希望知道 当前状态是从哪些状态转移过来,前面的状态可以通过 增加、删除、修改转移过来 。
属性
操作数的最小值,。
状态计算
按题意划分为删除,增加,修改,相等四种情况
- 删除:把删掉之后和匹配.所以没删除之前,就有与匹配
- 插入:插入之后与完全匹配,所以插入的就是,那填之前和匹配
- 替换:把改成之后想要与匹配,那么修改这一位之前,应该与匹配
- 相等:如果本来与这一位上就相等,那么不用改,即
结论
初始化
细节问题:初始化怎么搞
先考虑有哪些初始化嘛
-
:如果初始长度就是,那么只能用插入操作让它变成
-
:如果的长度是,那么只能用删除操作让它变成
-
= 其它初始化为
二、实现代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m;
char a[N], b[N];
int f[N][N];
// 最短编辑距离
int main() {
cin >> n >> a + 1 >> m >> b + 1;
// 初始化
for (int i = 0; i <= m; i++) f[0][i] = i;
for (int i = 0; i <= n; i++) f[i][0] = i;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
// 增加和删除
f[i][j] = min(f[i - 1][j] + 1, f[i][j - 1] + 1);
// 修改
if (a[i] == b[j])
f[i][j] = min(f[i][j], f[i - 1][j - 1]);
else // 相等
f[i][j] = min(f[i][j], f[i - 1][j - 1] + 1);
}
cout << f[n][m] << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-10-21 scratch2.0的教材视频,王木头系列
2014-10-21 技术体系需要继续探索的东西