LCS(最大公共子序列)问题的Python解法

2018-01-15  本文已影响985人  优雨

这是一道在codewars上看到的rank4的题目 LCS算是经典的算法题 时间复杂度为O(n^2) 由于解法巧妙 特此记录

子序列

一个字符串的子序列和子串不同,他不必是连续的,但是依旧得按照顺序

例如:

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

最大子序列的例子

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

有如下前提条件

wiki上关于LCS的资料如下

Longest common subsequence problem

主要关注解决这个问题的两个重要属性

具体的原因可以看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)]
上一篇下一篇

猜你喜欢

热点阅读