AcWing 902. 最短编辑距离

AcWing 902. 最短编辑距离

一、题目描述

给定两个字符串 AB,现在要将 A 经过若干操作变为 B,可进行的操作有:

  1. 删除–将字符串 A 中的某个字符删除。
  2. 插入–在字符串 A 的某个位置插入某个字符。
  3. 替换–将字符串 A 中的某个字符替换为另一个字符。

现在请你求出,将 A 变为 B 至少需要进行多少次操作。

输入格式
第一行包含整数 n,表示字符串 A 的长度。

第二行包含一个长度为 n 的字符串 A

第三行包含整数 m,表示字符串 B 的长度。

第四行包含一个长度为 m 的字符串 B。

字符串中均只包含大小写字母。

输出格式
输出一个整数,表示最少操作次数。

数据范围
1n,m1000

输入样例

10 
AGTCTGACGC
11 
AGTAAGTAGGC

输出样例

4

二、解题思路

LCS(最长公共子序列)问题的状态表示是很接近的。

QQ截图20210315105007.png

状态表示

f[i,j]a[1..i]变成b[1..j]的操作步数。

现在要求的是:两个字符串的最短编辑距离,由于我们不知道最短编辑距离是多少,就希望知道 当前状态是从哪些状态转移过来,前面的状态可以通过 增加、删除、修改转移过来

属性

操作数的最小值,min

状态计算

按题意划分为删除,增加,修改,相等四种情况

  • 删除:把a[i]删掉之后a[1i]b[1j]匹配.所以没删除之前,就有a[1i1]b[1j]匹配

f[i][j]=f[i1][j]+1

  • 插入:插入之后a[i]b[j]完全匹配,所以插入的就是b[j],那填之前a[1i]b[1(j1)]匹配

f[i][j]=f[i][j1]+1

  • 替换:把a[i]改成b[j]之后想要a[1i]b[1j]匹配,那么修改这一位之前,a[1(i1)]应该与b[1(j1)]匹配

f[i][j]=f[i1][j1]+1

  • 相等:如果本来a[i]b[j]这一位上就相等,那么不用改,即

f[i][j]=f[i1][j1]

结论

f[i][j]=min(f[i1][j]+1,f[i][j1]+1,f[i1][j1]+(a[i]==b[j]?0:1))

初始化

细节问题:初始化怎么搞

先考虑有哪些初始化嘛

  • f[0][i]:如果a初始长度就是0,那么只能用插入操作让它变成b

  • f[i][0]:如果b的长度是0,那么a只能用删除操作让它变成b

  • f[i][j] = INF 其它初始化为INF

二、实现代码

#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;
}
posted @   糖豆爸爸  阅读(343)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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 技术体系需要继续探索的东西
Live2D
点击右上角即可分享
微信分享提示