美文网首页
LCS(最大公共子序列)问题的Python解法

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

作者: 优雨 | 来源:发表于2018-01-15 18:04 被阅读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"

有如下前提条件

  • 两个参数均是字符串
  • 返回值也是字符串
  • 如果无LCS 返回空串
  • 所有测试用例只包含一个最大公共子序列 不用担心两个以上的解的问题

wiki上关于LCS的资料如下

Longest common subsequence problem

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

  • 如果两个字符串拥有相同的末位字符,则他们的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)]

相关文章

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

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

  • lintcode 最长公共子序列

    给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。说明最长公共子序列的定义: 最长公共子序列问题是在...

  • 最长递增子序列: 动态规划和LCS(最长公共子序列)

    最长递增子序列: 动态规划和LCS(最长公共子序列)子序列和子串的区别:子序列不连续,字串连续。这个题两种解法 动...

  • 子序列

    最长公共子序列(LCS)(lintcode 77) 描述:给出两个字符串,找到最长公共子序列(LCS),返回LCS...

  • LCS问题

    LCS问题包括最长公共子序列和最长公共子串,其中,最长公共子串要求必须连续。 对于二者的求解方式 最长公共子序列:...

  • (6)动态规划(上) LCS

    LCS 问题描述: 在两个给定的序列中, 找出最长的公共子序列(Largest Common Sequence),...

  • LCS详解

    LCS是什么 LCS是Longest Common Subsequence的缩写,即最长公共子序列。一个序列,如果...

  • 最大公共子序列(LCS)

    子序列 子序列不要求字符连续(这与串不同) 公共子序列 两个字符串中的相同的子序列 最大公共子序列的例子字符串 X...

  • 最长公共子序列

    最长公共子序列问题( Longest Common Subsequence problem,LCS) 是求两个给定...

  • LCS解析,打印最大长度和路径

    LCS是什么 LCS是Longest Common Subsequence的缩写,即最长公共子序列。它与子串的区别...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/clpdoxtx.html