用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM