求两个字符串的相似度或子串

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;

}

你可能感兴趣的:(字符串)