View Code
#include<IOSTREAM.H> #include <IOMANIP.H> #include <STRING.H> #include <STDLIB.H> //求两个字符串的最大公共子串 //公共子串是指两个串中存在相同顺序的字符,但这些字符不必相邻 /*int Length(int *array,char * A,int m,char *B,int n) { if (array[(strlen(B)+1)*m+n]<strlen(B)) return array[(strlen(B)+1)*m+n]; int temp; if (A[m-1]==B[n-1]) { temp=1+Length(array,A,m-1,B,n-1); } else { int temp1=0,temp2=0; temp1=Length(array,A,m-1,B,n); temp2=Length(array,A,m,B,n-1); temp=(temp1>temp2)?temp1:temp2; } array[(strlen(B)+1)*m+n]=temp; return temp; } void main() { char B[]="BDCABA"; char A[]="ABCBDAB"; int *array=(int*)malloc((strlen(A)+1)*(strlen(B)+1)*sizeof(int)); for (int i=0;i<strlen(A)+1;i++) { for (int j=0;j<strlen(B)+1;j++) { if(i==0) array[(strlen(B)+1)*i+j]=0; else if (j==0) array[(strlen(B)+1)*i+j]=0; else array[(strlen(B)+1)*i+j]=strlen(A)<strlen(B)?strlen(A):strlen(B); } } cout<<Length(array,A,strlen(A),B,strlen(B))<<endl; for (i=0;i<strlen(A)+1;i++) { for (int j=0;j<strlen(B)+1;j++) { cout<<setw(3)<<array[(strlen(B)+1)*i+j]; } cout<<endl; } free(array); cout<<endl; }*/ //采用自底向上的方法 void main() { char A[]="ACCGGTCGAGTGCGCGGAAGCCGGCCGAA"; char B[]="GTCGTTCGGAATGCCGTTGCTCTGTAAA"; int array[30][29]; for (int i=0;i<30;i++) array[i][0]=0; for (int j=0;j<29;j++) array[0][j]=0; for (i=1;i<30;i++) { for (j=1;j<29;j++) { if (A[i-1]==B[j-1]) { array[i][j]=1+array[i-1][j-1]; }else { array[i][j]=array[i-1][j]>=array[i][j-1]?array[i-1][j]:array[i][j-1]; } } } i=29;j=28; while(i&&j) { if(array[i][j]!=array[i-1][j]&&array[i][j]!=array[i][j-1]) { cout<<A[i-1]; i=i-1;j=j-1; }else if (array[i][j]==array[i-1][j]) { i=i-1; } else j=j-1; } cout<<endl; cout<<array[29][28]<<endl; }