设 A 和 B 是两个字符串。我们要用最少的字符操作次数,将字符串 AA 转换为字符串 BB。这里所说的字符操作共有三种:
- 删除一个字符;
- 插入一个字符;
- 将一个字符改为另一个字符。
A,B 均只包含小写字母。
输入格式
第一行为字符串 A;第二行为字符串 B;字符串 A,B 的长度均小于 20002000。
输出格式
只有一个正整数,为最少字符操作次数。
输入输出样例
输入 #1复制
sfdqxbw gfdgw
输出 #1复制
4
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
int dp[N][N];
char s1[N];
char s2[N];
int main() {
scanf("%s%s", s1 + 1, s2 + 1);
int n = strlen(s1 + 1);
int m = strlen(s2 + 1);
memset(dp, 0x3f, sizeof(dp));
for (int i = 0; i <= m; i++) {
dp[0][i] = i;
}
for (int i = 0; i <= n; i++) {
dp[i][0] = i;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1;
if (s1[i] == s2[j]) {
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
}
else {//删除 插入
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]+1);
}
}
}
cout << dp[n][m] << endl;
return 0;
}