zoukankan      html  css  js  c++  java
  • LCS (Longest Common Subsequence) 字符串最长公共子串算法

    LCS (Longest Common Subsequence) 算法用于找出两个字符串最长公共子串。

    算法原理:

    (1) 将两个字符串分别以行和列组成矩阵。
    (2) 计算每个节点行列字符是否相同,如相同则为 1。
    (3) 通过找出值为 1 的最长对角线即可得到最长公共子串。

      人 民 共 和 时 代
    中 0, 0, 0, 0, 0, 0
    华 0, 0, 0, 0, 0, 0
    人 1, 0, 0, 0, 0, 0
    民 0, 1, 0, 0, 0, 0
    共 0, 0, 1, 0, 0, 0
    和 0, 0, 0, 1, 0, 0
    国 0, 0, 0, 0, 0, 0

    为进一步提升该算法,我们可以将字符相同节点(1)的值加上左上角(d[i-1, j-1])的值,这样即可获得最大公用子串的长度。如此一来只需以行号和最大值为条件即可截取最大子串。

      人 民 共 和 时 代
    中 0, 0, 0, 0, 0, 0
    华 0, 0, 0, 0, 0, 0
    人 1, 0, 0, 0, 0, 0
    民 0, 2, 0, 0, 0, 0
    共 0, 0, 3, 0, 0, 0
    和 0, 0, 0, 4, 0, 0
    国 0, 0, 0, 0, 0, 0

    算法实现:

    public static string LCS(string s1, string s2)
    {
        if (s1 == s2)
            return s1;
        else if (String.IsNullOrEmpty(s1) || String.IsNullOrEmpty(s2))
            return null;
    
        var d = new int[s1.Length, s2.Length];
    
        var index = 0;
        var length = 0;
    
        for (int i = 0; i < s1.Length; i++)
        {
            for (int j = 0; j < s2.Length; j++)
            {
                // 左上角值
                var n = i - 1 >= 0 && j - 1 >= 0 ? d[i - 1, j - 1] : 0;
    
                // 当前节点值 = "1 + 左上角值" : "0"
                d[i, j] = s1[i] == s2[j] ? 1 + n : 0;
    
                // 如果是最大值,则记录该值和行号
                if (d[i, j] > length)
                {
                    length = d[i, j];
                    index = i;
                }
            }
        }
    
        return s1.Substring(index - length + 1, length);
    }

  • 相关阅读:
    Spring Boot中Bean对象的核心特性及依赖注入分析
    Spring Boot快速入门
    throw和throws
    Spring框架中的一些常见注释
    关于maven的介绍并创建一个简单的maven工程
    luffyapi~settings
    爬虫~requests
    爬虫~scrapy1
    爬虫~scrapy
    爬虫~选择器
  • 原文地址:https://www.cnblogs.com/zhangqs008/p/2341139.html
Copyright © 2011-2022 走看看