有样本P和文本T两个字符串。要用最少的字符操作将文本T转换为样本P。
这里所说的字符操作包括 (1)删除一个字符; (2)插入一个字符; (3)将一个字符改为另一个字符。
将T变换为字P所用的最少字符操作数称为T到 P的最短编辑距离,记为D(T,P)。
输入格式:
第一行是样本P,第二行是文本T。长度都不超过2000个字符。
输出格式:
输出编辑距离D(T,P)
输入样例:
在这里给出一组输入。例如:
apple
cat
输出样例:
在这里给出相应的输出。例如:
5
#include <stdio.h>
#include <string.h>
int min(int a, int b, int c) {
return (a < b) ? ((a < c) ? a : c) : ((b < c) ? b : c);
}
int editDistance(char *P, char *T) {
int m = strlen(P);
int n = strlen(T);
int dp[m + 1][n + 1];
for (int i = 0; i <= m; ++i)
dp[i][0] = i;
for (int j = 0; j <= n; ++j)
dp[0][j] = j;
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (P[i - 1] == T[j - 1])
dp[i][j] = dp[i - 1][j - 1]; // 字符相同,不需操作
else
dp[i][j] = 1 + min(dp[i - 1][j], // 删除
dp[i][j - 1], // 插入
dp[i - 1][j - 1]); // 替换
}
}
return dp[m][n];
}
int main() {
char P[2001], T[2001];
scanf("%s", P);
scanf("%s", T);
printf("%d\n", editDistance(P, T));
return 0;
}