传送门
f[i][j]表示字符串a的前i位转换成b的前j位需要的最小编辑次数
初始化f[i][0]=f[0][i]=i
有三种操作,所以有三个状态可以转换到f[i][j]
f[i-1][j]+1,将前i-1位变成前j位,然后删除第i位
f[i][j-1]+1,将前i位变成前j-1位,然后插入第j位的字符
f[i-1][j-1]+(a[i]!=b[j]),假如两位相等,则无需操作,否则需要把前i-1位变成前j-1位,并且把第i位变成第j位
代码
#include <iostream>
#include <cstring>
using namespace std;
const int N = 2010;
int f[N][N];
char a[N], b[N];
int main(){
cin>>a + 1>>b + 1;
int lena = strlen(a + 1), lenb = strlen(b + 1);
for(int i = 1;i <= lena;i++){
f[i][0] = i;
}
for(int i = 1;i <= lenb;i++){
f[0][i] = i;
}
for(int i = 1;i <= lena;i++){
for(int j = 1;j <= lenb;j++){
f[i][j] = min(f[i - 1][j] + 1, f[i][j - 1] + 1);
f[i][j] = min(f[i][j], f[i - 1][j - 1] + (int)(a[i] != b[j]));
}
}
cout<<f[lena][lenb]<<endl;
return 0;
}