题解
设的dp方程类似于最长公共子序列,设
dp[i][j]
表示成功匹配第一个字符串到
i
,第二个字符串到
分析四种操作
1.删除一个元素:
dp[i][j]→dp[i−1][j]+1
表示删除第一个串的第
i
个元素,让两串匹配成功只需要
2.插入一个元素:
3.修改一个元素:
dp[i][j]→dp[i−1][j−1]+1
表示第一个串的
i
位置的元素修改为第二个串
4.两个字符串的
i,j
位置相同:
dp[i][j]→dp[i−1][j−1]
直接从上一位继承而来。
#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
char ch1[4010], ch2[4010];
int f[4010][4010];
int main(){
scanf("%s%s", ch1+1, ch2+1);
int len1 = strlen(ch1+1), len2 = strlen(ch2+1);
for(int i = 0; i <= len1; i ++){
for(int j = 0; j <= len2; j ++){
int t = inf;
if(i == 0 && j == 0) continue;
if(i-1 >= 0 && j-1 >= 0) t = min(f[i-1][j-1]+1, t);
if(i-1 >= 0) t = min(f[i-1][j]+1, t);
if(j-1 >= 0) t = min(f[i][j-1]+1, t);
if(ch1[i] == ch2[j] && i-1 >= 0 && j-1 >= 0)
t = min(t, f[i-1][j-1]);
f[i][j] = t;
}
}
printf("%d", f[len1][len2]);
return 0;
}