最长公共子串(动态规划)

#include <stdio.h> #include <stdlib.h> #include <string.h>

void mostLengsub(char *,char *,int **);

int main(){

 char *x="abcdcdssab";  

char *y="acbcsdsbaa";  

int lenx = (int)strlen(x);

 int leny = (int)strlen(y);

 char *s = (char *)malloc(10);  

int **result = (int **)malloc(sizeof(int)*(lenx+1));

 int i,j,index = 0;;

 for (i=0;i<=lenx;i++){  

 result[i]=(int*)malloc(sizeof(int)*(leny+1));   

   for(j=0;j<=leny;j++){    result[i][j]=0;   }  

}

   

mostLengsub(x,y,result);  

 

 i=lenx;  j=leny;  

while(1){

  if(result[i-1][j]==result[i][j-1]){      

 if(result[i][j]>result[i-1][j-1]){    

 s[index++]=x[i-1];     

if(result[i][j]==1)      

break;    }       

 i--;    j--;   }   

if(result[i-1][j]!=result[i][j-1]){    

if(result[i-1][j]>result[i][j-1])    

 i--;    else j--;   }

 }

 s[index]='\0';

 printf("最长子串:%s",strrev(strdup(s)));

return 0; }

 

int getmax(int a,int b){  return a>b?a:b; }

 

void mostLengsub(char *x,char *y,int **a){

 unsigned int i,j;  

 for (i=1 ;i<=strlen(x);i++)  

 for(j=1;j<=strlen(y);j++)   {  

  if(x[i-1]==y[j-1]){     

a[i][j]=1+a[i-1][j-1];   

 }else{    

  a[i][j]=getmax(a[i-1][j],a[i][j-1]);   

 }  

 }

}

posted @ 2014-04-11 18:36  Blue-Dream  阅读(172)  评论(0编辑  收藏  举报