最开始把问题搞错了,以为是两个串都可以做修改,无论我怎么想都不通。
回到这个题目上,这道题和最长公共子序列很相似,思路可以说是一样的,包括记录路径。
其实也就是根据递推数组的结果来判断。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 85;
char A[maxn],B[maxn];
int dp[maxn][maxn],len1,len2;
void path()
{
int tmp, i = len1, j = len2;
int step = 0;
while(i >= 1 || j >= 1)
{
if(A[i-1] == B[j-1]) tmp = 0;
else tmp = 1;
if(dp[i][j] == dp[i-1][j-1] + tmp && i >= 1 && j >= 1)
{
if(tmp)
printf("%d Replace %d,%c\n",++step,i,B[j-1]);
i--, j--;
}
else if(dp[i][j] == dp[i-1][j] + 1 && i >= 1)
{
printf("%d Delete %d\n",++step,i);
i--;
}
else if(dp[i][j] == dp[i][j-1] + 1 && j >= 1)
{
printf("%d Insert %d,%c\n",++step,i+1,B[j-1]);
j--;
}
}
}
int main()
{
while(scanf("%s %s",A,B)!=EOF)
{
getchar();
len1 = strlen(A);
len2 = strlen(B);
memset(dp,0,sizeof(dp));
for(int i = 0; i <= len1; i++)
dp[i][0] = i;
for(int i = 0; i <= len2; i++)
dp[0][i] = i;
for(int i = 1; i <= len1; i++)
for(int j = 1; j <= len2; j++)
{
int tmp = min(dp[i][j-1],dp[i-1][j]) + 1;
int d = A[i-1] == B[j-1] ? 0 : 1;
dp[i][j] = min(tmp,dp[i-1][j-1]+d);
}
printf("%d\n",dp[len1][len2]);
path();
}
return 0;
}