zoukankan      html  css  js  c++  java
  • 最长公共子串和最长公共子序列

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

    例如: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;
    }
  • 相关阅读:
    codevs 1202 求和
    codevs 1201 最小数和最大数
    nyist 240 小明的调查统计(二)
    nyist28大数阶乘
    nyist 626 intersection set
    【】小技巧】CSS文字两端对齐
    Vue.js项目模板搭建
    25个最基本的JavaScript面试问题及答案
    java抽象类与接口的区别及用法
    JQuery事件手册
  • 原文地址:https://www.cnblogs.com/beaglebone/p/6001279.html
Copyright © 2011-2022 走看看