#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;
}