算法导论 练习题 15.4-5

来源:互联网 发布:二次元手机ar软件 编辑:程序博客网 时间:2024/05/24 23:15

根据自己思路写的最长公共子序列,稍微修改一下就行了

static 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;  }  static int** initM(char *x,char *y)  {      int xlen=strlen(x);      int ylen=strlen(y);      int i,j;      //m[i][0]:对x[i]之后的字符逐个进行比较,求出目前以x[i]开头最长子串的长度,存储在m[i][1]。//并找到x[i]最靠近y尾部的位置(但保证现在的子串以x[i]开头,即x[i]的位置比目前子串后面的字符在y中位置靠前),存储在m[i][0]      //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(x[i]<y[j] && 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;  } static 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");}



原创粉丝点击