LCS(最大公共子序列)問題的Python解法

這是一道在codewars上看到的rank4的題目 LCS算是經(jīng)典的算法題 時間復雜度為O(n^2) 由于解法巧妙 特此記錄

子序列

一個字符串的子序列和子串不同,他不必是連續(xù)的,但是依舊得按照順序

例如:

"abc"="a","b","c","ab","ac","bc","abc"

最大子序列的例子

lcs( "abcdef" , "abc" ) => returns "abc"
lcs( "abcdef" , "acf" ) => returns "acf"
lcs( "132535365" , "123456789" ) => returns "12356"

有如下前提條件

  • 兩個參數(shù)均是字符串
  • 返回值也是字符串
  • 如果無LCS 返回空串
  • 所有測試用例只包含一個最大公共子序列 不用擔心兩個以上的解的問題

wiki上關(guān)于LCS的資料如下

Longest common subsequence problem

主要關(guān)注解決這個問題的兩個重要屬性

  • 如果兩個字符串擁有相同的末位字符,則他們的LCS(xn, ym)等于LCS(xn-1, ym-1) ^ xn
  • 如果兩個字符串末位字符不同,則他們的LCS(xn, ym)等于longest(LCS(xn-1,ym), LCS(xn, ym-1))

具體的原因可以看wiki中的詳細解釋

以下是解法(不使用遞歸)

def lcs(x, y):
    matrix = [''] * (len(x) + 1)
    for index_x in range(len(matrix)):
        matrix[index_x] = [''] * (len(y) + 1)

    for index_x in range(1,len(x) + 1):
        for index_y in range(1,len(y) + 1):
            if x[index_x - 1] == y[index_y - 1]:#這里利用屬性一
                matrix[index_x][index_y] = matrix[index_x - 1][index_y - 1] + x[index_x - 1]
            elif len(matrix[index_x][index_y - 1]) > len(matrix[index_x -1][index_y]):#這里和下面利用屬性二
                matrix[index_x][index_y] = matrix[index_x][index_y - 1]
            else:
                matrix[index_x][index_y] = matrix[index_x - 1][index_y]
    
    return matrix[len(x)][len(y)]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容