您的位置:首页 > 其它

算法导论 思考题 15-5a (编辑距离)

2017-05-30 23:17 260 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

#define OP_NUM 5
#define COPY 0
#define REPLACE 1
#define DELETE 1
#define INSERT 1
#define TWIDDLE 1
#define KILL 0

int** dp(char *x,char *z,char **b)
{
int i,j,xlen=strlen(x),zlen=strlen(z);
xlen=xlen+1;
zlen=zlen+1;
int **s=(int**)malloc(xlen*sizeof(int*));
for(int k=0;k<xlen+1;k++)
{
s[k]=(int*)malloc(zlen*sizeof(int));
}
for(i=0;i<xlen;i++)
{
s[i][0]=DELETE;
b[i][0]='D';
}
for(j=0;j<zlen;j++)
{
s[0][j]=INSERT;
b[0][j]='I';
}

for(i=1;i<xlen;i++)
{
for(j=1;j<zlen;j++)
{
s[i][j]=INT_MAX;

if(x[i-1]==z[j-1])
{
if(s[i-1][j-1]+COPY<s[i][j])
{
s[i][j]=s[i-1][j-1]+COPY;
b[i][j]='C';
}
}
else
{
if(s[i-1][j-1]+REPLACE<s[i][j])
{
s[i][j]=s[i-1][j-1]+REPLACE;
b[i][j]='R';
}

}
if(s[i-1][j]+DELETE<s[i][j])
{
s[i][j]=s[i-1][j]+DELETE;
b[i][j]='D';
}
if(s[i][j-1]+INSERT<s[i][j])
{
s[i][j]=s[i][j-1]+INSERT;
b[i][j]='I';
}
if(i>=2 && j>=2 && x[i-1]==z[j-2] && x[i-2]==z[j-1] && s[i-2][j-2]+TWIDDLE<s[i][j])
{
s[i][j]=s[i-2][j-2]+TWIDDLE;
b[i][j]='T';
}

}
}
return s;
}

void printS(int **s,int xlen,int zlen)
{
xlen=xlen+1;
zlen=zlen+1;
for(int i=0;i<xlen;i++)
{
for(int j=0;j<zlen;j++)
{
printf("%2d ",s[i][j]);
}
printf("\n");
}
}

void printB(char **b,int xlen,int zlen)
{
xlen=xlen+1;
zlen=zlen+1;
for(int i=0;i<xlen;i++)
{
for(int j=0;j<zlen;j++)
{
printf("%2c ",b[i][j]);
}
printf("\n");
}
}

void getTrace(char **b,int i,int j)
{
if(i<=0 && j<=0)
return;
if(b[i][j]=='C' || b[i][j]=='R')
getTrace(b,i-1,j-1);
else if(b[i][j]=='D')
getTrace(b,i-1,j);
else if(b[i][j]=='I')
getTrace(b,i,j-1);
else
getTrace(b,i-2,j-2);
if(b[i][j]=='C')
printf("%s ","COPY");
else if(b[i][j]=='R')
printf("%s ","REPLACE");
else if(b[i][j]=='D')
printf("%s ","DELETE");
else if(b[i][j]=='I')
printf("%s ","INSERT");
else
printf("%s ","TWIDDLE");
}

void main()
{
char *x="algorithm";
char *z="altruistic";
//char *x="aaabbbcccddd";
//char *z="aaaeeeddd";
int xlen=strlen(x),zlen=strlen(z);
char **b=(char**)malloc((xlen+1)*sizeof(char*));
for(int k=0;k<xlen+1;k++)
{
b[k]=(char*)malloc((zlen+1)*sizeof(int));
}
int **s=dp(x,z,b);
printS(s,xlen,zlen);
printB(b,xlen,zlen);
getTrace(b,xlen,zlen);
getchar();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: