欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 中最長公共子序列的長度

 更新時間:2023年06月20日 11:13:28   作者:跡憶客  
子序列是在不改變剩余字符的順序的情況下,在刪除一些字符或不刪除任何字符后從給定序列獲得的序列,這篇文章主要介紹了Python 中的最長公共子序列,需要的朋友可以參考下

子序列是在不改變剩余字符的順序的情況下,在刪除一些字符或不刪除任何字符后從給定序列獲得的序列。 最長公共子序列是指所有給定序列共有的最長子序列。

本篇文章講介紹在 Python 中查找兩個序列之間最長公共子序列的長度。

使用 Naive 方法在 Python 中查找最長公共子序列

假設(shè)我們有兩個序列:S1 和 S2,其中:

S1 = QEREW
S2 = QWRE

這里,常見的子序列是 QE、QW、QR、QRE 和 RE。 其中最長的公共子序列是QRE,長度為3。

現(xiàn)在,讓我們看看打印最長公共子序列長度的 Python 解決方案。

代碼:

def LCS(S1, S2, x, y):
    if x == 0 or y == 0:
        return 0
    if S1[x - 1] == S2[y - 1]:
        return LCS(S1, S2, x - 1, y - 1) + 1
    return max(LCS(S1, S2, x, y - 1), LCS(S1, S2, x- 1, y))
S1 = "QEREW"
S2 = "QWRE"
x = len(S1)
y = len(S2)
print ("Length of LCS is", LCS(S1, S2, x, y))

輸出:

Length of LCS is 3

這種方法是用遞歸方法解決 Python 中的 LCS 問題。 它檢查給定序列的所有可能子序列并找到最長的公共子序列。

使用動態(tài)規(guī)劃在 Python 中查找最長公共子序列

動態(tài)規(guī)劃是普通遞歸方法的優(yōu)化。 正如我們所看到的,遞歸方法中存在重疊的子問題,具有許多重復(fù)的函數(shù)調(diào)用。

動態(tài)方法將每個函數(shù)調(diào)用的結(jié)果保存在一個數(shù)組中,以便在需要時使用。 結(jié)果,它減少了函數(shù)調(diào)用的次數(shù)。

代碼:

def LCS(S1, S2, m, n):
    R = [[None]*(n+1) for i in range(m+1)]
    for i in range(m+1):
        for j in range(n+1):
            if i == 0 or j == 0:
                R[i][j] = 0
            elif S1[i-1] == S2[j-1]:
                R[i][j] = R[i-1][j-1] + 1
            else:
                R[i][j] = max(R[i-1][j], R[i][j-1])
    return R[m][n]
S1 = "QEREW"
S2 = "QWRE"
m = len(S1)
n = len(S2)
print("Length of LCS is",LCS(S1, S2, m, n))

輸出:

Length of LCS is 3

這種方法更快、更有效,因為它具有 O(mn) 的時間復(fù)雜度。

到此這篇關(guān)于Python 中的最長公共子序列的文章就介紹到這了,更多相關(guān)Python最長公共子序列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論