题目大意:给定两个字符串x,y,要你求出x经过插入,删除,替换变成y所要的最少操作,即编辑距离。
解题思路:动态规划,列出状态方程,设dp[i][j]表示字符串x[1...i]和字符串y[1...j]的最短编辑距离
当x[i] == y[j]时,i和j不需要编辑,要么删除,要么插入,要么替换
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j] + 1, dp[i][j - 1] + 1)
当x[i] != y[i]时, i和j不需要编辑
dp[i][j] = min(dp[i-1][j-1] + 1, dp[i-1][j] + 1, dp[i][j-1] + 1);
注意初始化
dp[i][0] = dp[0][i] = i;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1010;
char strx[maxn], stry[maxn];
int lenx, leny, dp[maxn][maxn];
int main()
{
while( scanf("%d %s", &lenx, strx + 1) != EOF)
{
scanf("%d %s", &leny, stry + 1);
int maxv = max(lenx, leny);
dp[0][0] = 0;
for(int i = 1; i <= maxv; i++)
dp[0][i] = dp[i][0] = i;
for(int i = 1; i <= lenx; i++)
{
for(int j = 1; j <= leny; j++)
{
dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] + 1);
if(strx[i] == stry[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);
}
}
printf("%d\n", dp[lenx][leny]);
}
return 0;
}