码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-10-26 19:10:43      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:image   for   size   div   子串   ring   []   ret   nbsp   

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

例如: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;
}

 

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

标签:image   for   size   div   子串   ring   []   ret   nbsp   

原文地址:http://www.cnblogs.com/beaglebone/p/6001279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!