给定两个字符串 A 和 B,现在要将 A 经过若干操作变为 B,可进行的操作有:
-
删除–将字符串 A 中的某个字符删除
-
插入–在字符串 A 的某个位置插入某个字符
-
替换–将字符串 A 中的某个字符替换为另一个字符
现在请你求出,将 A 变为 B 至少需要进行多少次操作。
Sample Input
fxpimu
xwrs
Sample Output
5
思路:f[i][j]表示第一个字符串的前i位与第二个字符串的前j位变得一样的操作次数,所以需要初始化f[i][0]=i,f[0][j]=j 二重循环时f[i][j]一定能由f[i-1][j]或f[i][j-1]得到,再看a[i]与b[j]的关系,f[i][j]可以由f[i-1][j-1]得到;
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2010;
char a[N],b[N];
int f[N][N];
int n;
int main()
{
scanf("%s",a+1);
scanf("%s",b+1);
int n=strlen(a+1);
int m=strlen(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);
}
printf("%d\n",f[n][m]);
return 0;
}