最短编辑距离
C++
最短编辑距离
/* 给定两个字符串 A 和 B,现在要将 A 经过若干操作变为 B,可进行的操作有: 删除–将字符串 A 中的某个字符删除。 插入–在字符串 A 的某个位置插入某个字符。 替换–将字符串 A 中的某个字符替换为另一个字符。 现在请你求出,将 A 变为 B 至少需要进行多少次操作。 1 ≤ n, m ≤ 1000 f[i][j] 表示 A[i] -> B[j] 至少需要的操作次数 if a[i] != b[j]: f[i][j] = min( f[i-1][j] + 1, # delete f[i][j-1] + 1, # insert f[i-1][j-1] + 1, # change ) else: f[i][j] = f[i-1][j-1]; # 这个一定是最小的,因为 f[i][j-1] 和 f[i-1][j-1]肯定最多相差一, # 那么 f[i-1][j-1] <= f[i][j-1] + 1, f[i-1][j-1] <= f[i-1][j] + 1 */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int N = 1010; int n, m; char a[N], b[N]; int f[N][N]; int solution_one() { f[0][0] = 0; for (int i = 0; i <= n; i ++ ) { f[i][0] = i; } for (int i = 0; i <= m; i ++ ) { f[0][i] = i; } for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= m; j ++ ) { if (a[i] == b[j]) { f[i][j] = f[i - 1][j - 1]; } else { f[i][j] = min( min(f[i-1][j], f[i][j-1]), f[i-1][j-1] ) + 1; } } } return f[n][m]; } int main() { scanf("%d", &n); scanf("%s", a + 1); scanf("%d", &m); scanf("%s", b + 1); int res = solution_one(); printf("%d", res); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下