算法导论 最长公共子序列(按自己思路写的)

来源:互联网 发布:淘宝2016年全年销售额 编辑:程序博客网 时间:2024/06/09 14:46
#include <stdio.h>  #include <stdlib.h>  #include <string.h>    int getlastPos(char *s,char c,int pos)  {      int len=strlen(s),i;      for(i=pos-1;i>=0;i--)      {          if(c==s[i])              return i;      }      return i;  }    int** initM(char *x,char *y)  {      int xlen=strlen(x);      int ylen=strlen(y);      int i,j;      //m[i][0]:根据x[i]之后的字符进行DP,在保证x[i]开头子串最长的情况下,存储x中第i个字符在y中最后出现的位置      //m[i][1]:以x中第i个字符开头的最大子公共序列长度  //m[i][2]:以x[i]开头的最长子串下一个字符位置    int **m=(int **)malloc(xlen*sizeof(int*));      for(i=0;i<xlen;i++)      {          m[i]=(int*)malloc(3*sizeof(int));      }      for(i=0;i<xlen;i++)      {          m[i][0]=m[i][1]=0;m[i][2]=xlen;      }      for(i=xlen-1;i>=0;i--)      {          m[i][0]=getlastPos(y,x[i],ylen);          if(m[i][0]!=-1)              m[i][1]=1;          else              m[i][1]=0;          for(j=i+1;j<xlen;j++)          {              int pos=getlastPos(y,x[i],m[j][0]);              if(pos>=0 && m[j][1]+1>m[i][1])              {                  m[i][0]=pos;                  m[i][1]=m[j][1]+1;  m[i][2]=j;            }          }      }      return m;  }  void printM(int **m,int xlen,int ylen,char *x){for(int i=0;i<xlen;i++){printf("%c ",x[i]);for(int j=0;j<ylen;j++){printf("%d ",m[i][j]);}printf("\n");}}void printResult(int **m,int xlen,int max,char* x){int i,j;for(i=0;i<xlen;i++){if(m[i][1]==max)break;}while(i<xlen){printf("%c ",x[i]);i=m[i][2];}printf("\n");}void main()  {      char *x="ABCBDAB";      char *y="BDCABA";      /*int i=getlastPos(x,'B',5);     printf("%d",i);*/      int **m=initM(x,y);      int max=-1;      for(int i=0;i<strlen(x);i++)      {          if(m[i][1]>max)              max=m[i][1];      }      printf("%d\n",max);//printM(m,strlen(x),3,x);printResult(m,strlen(x),max,x);    getchar();  }

原创粉丝点击