您的位置:首页 > 其它

算法导论 练习题 15.4-3

2017-05-24 11:22 323 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int lcsLength(int **c,char *x,char *y,int i,int j)
{
if(i<0 || j<0)
return -1;
if(c[i][j] != -1)
return c[i][j];
if(x[i-1]==y[j-1])
{
int a=lcsLength(c,x,y,i-1,j-1);
c[i][j]=a+1;
}
else
{
int up=lcsLength(c,x,y,i-1,j);
int left=lcsLength(c,x,y,i,j-1);
if(up>=left)
c[i][j]=up;
else
c[i][j]=left;
}
return c[i][j];
}

int** initC(char *x,char *y)
{
int xlen=strlen(x);
int ylen=strlen(y);
int **c=(int**)malloc((xlen+1)*sizeof(int*));
for(int i=0;i<xlen+1;i++)
{
c[i]=(int*)malloc((ylen+1)*sizeof(int));
}
for(int i=0;i<xlen+1;i++)
for(int j=0;j<ylen+1;j++)
c[i][j]=-1;
for(int i=0;i<xlen+1;i++)
c[i][0]=0;
for(int j=0;j<ylen+1;j++)
c[0][j]=0;
return c;
}

void printLCS(int **c,char *x,char *y)
{
int xlen=strlen(x);
int ylen=strlen(y);
int i=xlen,j=ylen;
char *s=(char*)malloc((xlen)*sizeof(char));
while(i>=1 && j>=1)
{
if(x[i-1]==y[j-1])
{
s[i-1]=x[i-1];
i--;
j--;
}
else if(c[i][j]==c[i-1][j])
{
s[i-1]='*';
i--;
}
else
j--;
}
for(;i<xlen;i++)
{
if(s[i]!='*')
printf("%c ",s[i]);
}
printf("\n");
}

void printC(int **c,int xlen,int ylen)
{
for(int i=1;i<xlen+1;i++)
{
for(int j=1;j<ylen+1;j++)
{
if(c[i][j]==-1)
printf("%d ",c[i][j]);
else
printf("%d  ",c[i][j]);
}
printf("\n");
}
}

void main()
{
char *x="ABCBDAB";
char *y="BDCABA";
int **c=initC(x,y);
lcsLength(c,x,y,strlen(x),strlen(y));
printLCS(c,x,y);
//printC(c,strlen(x),strlen(y));
getchar();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: