首页 > 代码库 > 最长公共子串和最长公共子序列

最长公共子串和最长公共子序列

最长公共子串与最长公共子序列是有区别的。区别在于最长公共子串要求字符是连续的。

例如:str1:  abcd      str2:  abec
那么最长公共子序列是:abc,长度为3
最长公共子串是:ab,长度为2

1. 最长公共子序列

Largest common subsequence 最长公共子序列:用f[i][j]表示str1的前i个字符与str2的前j个字符的最长公共子序列的长度。

技术分享

int LCS(int a[],int b[],int len)
{
    vector<int> f(len+1,0);
    for(int i=1;i<=len;i++)
        for(int j=1;j<=len;j++)
        {
            f[j]=a[i-1]==b[j-1]?f[j-1]+1:max(f[j],f[j-1]);
        }

    return f[len];
}

 

2. 最长公共子串

Largest common substring 最长公共子串:用f[i][j]表示str1的包含第i个字符的前i个字符 与 str2的包含第j个字符的前j个字符的 最长公共连续子序列。

当a[i]==b[j]时,f[i][j]=f[i-1][j-1]+1

当a[i]!=b[j]时,f[i][j]=0

int lcs(string a,string b)
{
    int m=a.size();
    int n=b.size();
    if(m==0||n==0)
        return 0;
    int max_len=-1;
    vector<vector<int>> f(m+1,vector<int>(n+1));
    for(int i=0;i<=m;i++)
        f[i][0]=0;
    for(int j=0;j<=n;j++)
        f[0][j]=0;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
        {
            if(a[i-1]==b[j-1])
                f[i][j]=f[i-1][j-1]+1;
            else
                f[i][j]=0;
            max_len=max(max_len,f[i][j]);
        }
    return max_len;
}

 

最长公共子串和最长公共子序列