首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

最长公共子序列Python 2函数

最长公共子序列(Longest Common Subsequence,简称LCS)是指在两个序列中找到最长的公共子序列的问题。公共子序列是指两个序列中都存在的、不一定连续的元素组成的序列。

在Python 2中,可以使用动态规划的方法来解决最长公共子序列问题。下面是一个实现最长公共子序列的Python 2函数:

代码语言:python
代码运行次数:0
复制
def longest_common_subsequence(str1, str2):
    m = len(str1)
    n = len(str2)
    dp = [[0] * (n + 1) for _ in range(m + 1)]

    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if str1[i - 1] == str2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

    lcs_length = dp[m][n]
    lcs = [''] * lcs_length
    i = m
    j = n

    while i > 0 and j > 0:
        if str1[i - 1] == str2[j - 1]:
            lcs[lcs_length - 1] = str1[i - 1]
            i -= 1
            j -= 1
            lcs_length -= 1
        elif dp[i - 1][j] > dp[i][j - 1]:
            i -= 1
        else:
            j -= 1

    return ''.join(lcs)

这个函数接受两个字符串作为输入,并返回它们的最长公共子序列。函数使用一个二维数组dp来保存中间结果,其中dp[i][j]表示str1的前i个字符和str2的前j个字符的最长公共子序列的长度。函数首先初始化dp数组为全0,然后使用两个嵌套的循环遍历str1str2的所有字符。如果当前字符相等,则最长公共子序列的长度加1,并且继续考虑下一个字符;如果当前字符不相等,则最长公共子序列的长度取前一个状态中较大的值。最后,根据dp数组的结果,构造出最长公共子序列。

这个函数的时间复杂度为O(mn),其中m和n分别是两个输入字符串的长度。

推荐的腾讯云相关产品:腾讯云函数(Serverless Cloud Function),腾讯云云数据库(TencentDB),腾讯云对象存储(COS),腾讯云人工智能(AI),腾讯云物联网(IoT Hub)等。你可以通过腾讯云官方网站(https://cloud.tencent.com/)了解更多关于这些产品的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

最长公共串+最长公共序列

最长公共串(注意串是连续的) 1、先建立一个二维数组array[str1.size()][str2.size()](全部初始化为0),初始化第一行和第一列(元素相同处置1),然后进入状态方程 2、状态转移方程...,str2)<<endl; 47 } 48 return 0; 49 } 最长公共序列(注意序列可以不连续) 1、先建立一个二维数组array[str1.size()+1][str2...1 /* 2 本程序说明: 3 4 最长公共序列 5 6 */ 7 #include 8 #include 9 #include <string...1 /* 2 本程序说明: 3 4 最长公共序列(加上了其中一个序列的打印功能,回溯法) 5 6 */ 7 #include 8 #include <vector...getline(cin,str2)){ 65 cout<<findLCS(str1,str2)<<endl; 66 } 67 return 0; 68 }  最长公共序列扩展题

2.6K30

最长公共序列最长公共

最长公共序列 举个例子:s1="abcfde",s2="bcde"。那么s1与s2最长公共序列就是"bcde",注意不要求连续。该问题是典型的动态规划问题。...(i, j)从0开始,那么递推关系很容易找到:(maxLen(i,j)表示s1字符串左边i个字符构成的串与s2左边j个字符构成的串的最长公共序列长度,下同) if(s1[i-1] == s2[j-...{ LCS(); PrintLCS(strlen(s1), strlen(s2)); cout << endl; } } 最长公共最长公共串与上述最长公共序列不一样...例如s1="asdfddsx",s2="asssdfed",那么s1与s2最长公共串是:"sdf"。...最长公共串的输出比上面最长公共序列简单,因为后者一定是连续的,我们只要保存最后一个两个字符串字符相等的位置index,以及最长公共串的长度length,然后从index位置往回倒推index个字符即可

1K10
  • 最长公共序列

    本文记录寻找两个字符串最长公共串和序列的方法。...名词区别 最长公共串(Longest Common Substring)与最长公共序列(Longest Common Subsequence)的区别: 串要求在原字符串中是连续的,而序列则只需保持相对顺序...最长公共串 是指两个字符串中最长连续相同的串长度。 例如:str1=“1AB2345CD”,str2=”12345EF”,则str1,str2最长公共串为2345。...最长公共序列 串要求字符必须是连续的,但是序列就不是这样。 最长公共序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。...对一段文字进行修改之后,计算改动前后文字的最长公共序列,将除此序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。

    4.3K40

    最长公共序列问题

    问题描述: 求两个字符序列公共最长序列。 ---- 最长公共串 在回到序列问题之前,先来了解一下串的问题。 例如,HISH和FISH两个字符序列公共最长子串就是:ISH。很容易理解。...在这个例子中,你要找出两个单词的最长公共序列。hish和fish都包含的最长序列是什么?hish和vista呢?这就是你要计算的值。 别忘了,单元格中的值通常就是你要优化的值。...例如单词hish和vista的最长公共串时,网格如下: ? ---- 最长公共序列 假设Alex不小心输入了fosh,那么它原本是想输入fish还是fort呢?我们使用最长序列来比较它们。 ?...最长公共个子串的长度相同,都包含两个字母。但fosh与fish更像。 ? 这里比较的是最长公共串,但其实应该比较最长序列:两个单词中都有的序列包含的字数。如何计算最长公共序列呢?...下面是用于计算fish和fosh的最长公共序列的网格: ? 下面是填写这个网格的公式: ?

    1.5K40

    漫画:最长公共序列

    题目: 给定两个字符串 str1 和 str2,返回这两个字符串的最长公共序列的长度 解释:一个字符串的序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符...)后组成的新字符串,如下图示: 也就是说对于以下两个字符串 str1 和 str2,其最长公共串为 「acg」。...阿宝的想法 dp 是个二维数组,即 dp[i][j], 表示对于串 str1[0..i] 与串 str2[0..j], 它们的最长公共序列长度为 dp[i][j],这样的话根据定义, dp[str1...0..j] 的最长公共序列即可,即 dp[i-1][j], 同理对于dp[i][j-1],即为丢弃 j ,求 str1[0..i] 与 str2[0..j-1] 的最长公共序列 既然 dp[i][j...综上可知状态状态方程如下: 阿宝的想法: 空字符串与任何字符串的最长公共序列都为 0,所以 dp[0][i], dp[j][0] 都为 0(i 为 0 到 str1 的长度, j 为 0 到 str2

    1K31

    最长公共序列(LCS)

    最长公共序列(LCS) 0、写在前面 1、问题描述 2最长公共序列的结构 3、问题的递归结构 4、计算最优值 5、算法的改进 6、参考 ---- ---- 0、写在前面 若给定序列X={x1...给定2序列X和Y,当另一序列Z既是X的序列又是Y的序列时,称Z是序列X和Y的公共序列。 给定2序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共序列。...Y 中出现每个子序列 O(n) 时间,X 有 2m 个 序列,最坏情况下时间复杂度:O(n·2m) 2最长公共序列的结构 设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共序列为...3、问题的递归结构 由最长公共序列问题的最优结构性质建立问题最优值的递归关系。用c[i][j]记录序列和的最长公共序列的长度。...如果只需要计算最长公共序列的长度,则算法的空间需求可大大减少。事实上,在计算c[i][j]时,只用到数组c的第i行和第i-1行。因此,用2行的数组空间就可以计算出最长公共序列的长度。

    90510

    漫画:最长公共序列

    题目: 给定两个字符串 str1 和 str2,返回这两个字符串的最长公共序列的长度 解释:一个字符串的序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符...)后组成的新字符串,如下图示: 也就是说对于以下两个字符串 str1 和 str2,其最长公共串为 「acg」。...阿宝的想法 dp 是个二维数组,即 dp[i][j], 表示对于串 str1[0..i] 与串 str2[0..j], 它们的最长公共序列长度为 dp[i][j],这样的话根据定义, dp[str1...0..j] 的最长公共序列即可,即 dp[i-1][j], 同理对于dp[i][j-1],即为丢弃 j ,求 str1[0..i] 与 str2[0..j-1] 的最长公共序列 既然 dp[i][j...综上可知状态状态方程如下: 阿宝的想法: 空字符串与任何字符串的最长公共序列都为 0,所以 dp[0][i], dp[j][0] 都为 0(i 为 0 到 str1 的长度, j 为 0 到 str2

    93730

    序列比对(24)最长公共序列

    本文介绍如何求解两个字符串的最长公共序列最长公共序列问题 前文《序列比对(23)最长公共字符串》介绍了如何求解两个字符串的最长公共字符串,本文将介绍如何求解两个字符串的最长公共序列。...二者听起来很像,所以我们首先得说明一下字符串和序列的区别。 ?...与最长公共字符串问题类似,最长公共序列问题也是一种序列比对问题,可以用动态规划解决,只是在迭代时允许插入和缺失,而不允许错配而已。如果是匹配,得分为1,否则得分为0。其迭代公式如下: ?...动态规划求解最长公共序列的代码 具体代码如下: #include #include #include #define MAXSEQ 1000...,i)与序列r(1,...

    54510
    领券