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

    如何用Python计算最长公共子序列和最长公共子串

    1. 什么是最长公共子序列?什么是最长公共子串?

    1.1. 最长公共子序列(Longest-Common-Subsequences,LCS)

    最长公共子序列(Longest-Common-Subsequences,LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。这与查找最长公共子串的问题不同的地方是:子序列不需要在原序列中占用连续的位置

    最长公共子序列问题是一个经典的计算机科学问题,也是数据比较程序,比如Diff工具,和生物信息学应用的基础。它也被广泛地应用在版本控制,比如Git用来调和文件之间的改变。

    1.2 最长公共子串(Longest-Common-Substring,LCS)

    最长公共子串(Longest-Common-Substring,LCS)问题是寻找两个或多个已知字符串最长的子串。此问题与最长公共子序列问题的区别在于子序列不必是连续的,而子串却必须是连续的。

    2. 如何求解最长公共子序列?

    例如序列str_a=world,str_b=wordl。序列wo是str_a和str_b的一个公共子序列,但是不是str_a和str_b的最长公共子序列,子序列word是str_a和str_b的一个LCS,序列worl也是。

    暴力查找?
    寻找LCS的一种方法是枚举X所有的子序列,然后注意检查是否是Y的子序列,并随时记录发现的最长子序列。假设X有m个元素,则X有2^m个子序列,指数级的时间,对长序列不实际。

    2.1 基于递归的方法

    根据上边分析结果,可以写出简洁易懂的递归方法。

    def recursive_lcs(str_a, str_b):
      if len(str_a) == 0 or len(str_b) == 0:
        return 0
      if str_a[0] == str_b[0]:
        return recursive_lcs(str_a[1:], str_b[1:]) + 1
      else:
        return max([recursive_lcs(str_a[1:], str_b), recursive_lcs(str_a, str_b[1:])])
    
    print(recursive_lcs('qweasde', 'asdzeexc'))
    

    2.2 基于自底向上动态规划的方法

    根据上述分析问题,动态规划递推公式也非常明显,可以写出动态规划代码:

    转载:https://www.cnblogs.com/CheeseZH/p/8830482.html

  • 相关阅读:
    18.5 推挽输出和开漏输出区别
    19.3 Table 1-2.S3C2440A 289-Pin FBGA Pin Assignments (Sheet 4 of 9) (Continued)
    19.2 MEMORY CONTROLLER
    19.1 PORT CONTROL DESCRIPTIONS
    17.2 SourceInsight批量注释
    17.3 删除没用的project
    17.1 添加汇编文件并可索引
    16.2 在SecureCRT编写C程序不高亮显示
    16.1 解决SecureCRT的Home+End+Del不好用使用方法
    15.1 打开文件时的提示(不是dos格式)去掉头文件
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/9531968.html
Copyright © 2011-2022 走看看