用Python計算最長公共子串行和最長公共子串

2022-03-22 07:17:53 字數 1021 閱讀 5767

最長公共子串行(longest-common-subsequences,lcs)是乙個在乙個序列集合中(通常為兩個序列)用來查詢所有序列中最長子序列的問題。這與查詢最長公共子串的問題不同的地方是:子串行不需要在原序列中占用連續的位置

最長公共子串行問題是乙個經典的電腦科學問題,也是資料比較程式,比如diff工具,和生物資訊學應用的基礎。它也被廣泛地應用在版本控制,比如git用來調和檔案之間的改變。

最長公共子串(longest-common-substring,lcs)問題是尋找兩個或多個已知字串最長的子串。此問題與最長公共子串行問題的區別在於子串行不必是連續的,而子串卻必須是連續的。

例如序列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個子序列,指數級的時間,對長序列不實際。

根據上邊分析結果,可以寫出簡潔易懂的遞迴方法。

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'))

根據上述分析問題,動態規劃遞推公式也非常明顯,可以寫出動態規劃**:

**:

詳解Python最長公共子串和最長公共子串行的實現

最長公共子串 the longest common substring lcs問題就是求兩個字串最長公共子串的問題。解法就是用乙個矩陣來記錄兩個字串中所有位置的兩個字元之間的匹配情況,若是匹配則為1,否則為0。然後求出對角線最長的1的序列,其對應的位置就是最長匹配子串的位置。def find lcs...

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...