#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int max(int a,int b)
{
return a>=b?a:b;
}
int ** palindrome(char *s,int* b)
{
int maxlen=strlen(s)+1,i,j,l;
int **m=(int**)malloc((maxlen+1)*sizeof(int*));
for(i=0;i<maxlen+1;i++)
{
m[i]=(int*)malloc((maxlen+1)*sizeof(int));
}
for(i=0;i<maxlen+1;i++)
m[i][0]=0;
for(j=0;j<maxlen+1;j++)
m[0][j]=0;
for(i=1;i<maxlen+1;i++)
{
for(j=1;j<maxlen+1;j++)
{
if(i==j)
{
m[i][j]=1;
}
else
{
m[i][j]=0;
}
}
}
for(l=2;l<maxlen;l++)
{
for(i=1;i<maxlen-l+1;i++)
{
j=i+l-1;
if(s[i-1]==s[j-1])
{
m[i][j]=m[i+1][j-1]+2;
b[i]=j;
b[j]=i;
}
else
m[i][j]=max(m[i][j-1],m[i+1][j]);
}
}
return m;
}
int* initB(int len)
{
int *m=(int*)malloc((len+1)*sizeof(int));
for(int i=0;i<len+1;i++)
{
m[i]=-1;
}
return m;
}
void printM(int **m,int len)
{
for(int i=0;i<len+1;i++)
{
for(int j=0;j<len+1;j++)
{
printf("%d ",m[i][j]);
}
printf("\n");
}
}
void constructPalindrome(int *b,int len,char *s)
{
for(int j=1;j<len+1;j++)
{
if(j==b[b[j]])
printf("%c ",s[j-1]);
if(b[j]==j+2)
b[j+1]=j+1;
}
printf("\n");
}
void printb(int *b,int len)
{
for(int i=0;i<len+1;i++)
{
printf(" %d ",i);
}
printf("\n");
for(int i=0;i<len+1;i++)
{
if(b[i]==-1)
printf("%d ",b[i]);
else
printf(" %d ",b[i]);
}
printf("\n");
}
void main()
{
char *s="character";
//char *s="BBABCBCAB";
//char *s="CAC";
int len=strlen(s);
int* b=initB(len);
int **m=palindrome(s,b);
//printM(m,len);
printf("maxlen=%d\n",m[1][len]);
//printb(b,len);
constructPalindrome(b,len,s);
getchar();
}
算法导论 思考题 15-2(最长回文子序列)
最新推荐文章于 2020-06-14 21:59:18 发布