最长公共子串(动态规划)
#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]);
}
}
}