算法导论 思考题 15-2(最长回文子序列)

来源:互联网 发布:crf算法实现 编辑:程序博客网 时间:2024/06/07 11:01
#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;}elsem[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]);elseprintf(" %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();}

原创粉丝点击