python算法问题,求两个字符串的最长公共子序列长度

本文讲述了如何利用动态规划方法求解两个字符串S1和S2的最长公共子序列问题,通过构建二维数组模拟状态转移,有效降低了计算复杂度。给出了Python代码实现,展示了如何通过比较字符和状态转移规则计算最长子序列长度。
摘要由CSDN通过智能技术生成

对于问题,两个字符串的最长公共子序列长度进行求解,首先要知道子序列的定义,如果说给定一个字符串,对这个字符串中的原有字符进行不改变字符相对位置的删除,这里的相对位置就是处于前还是后的相对关系,进行删除字符的操作之后,所形成的新的字符串就是原来的字符串的子序列。

这里要求解的问题,就是给定两个字符串S1和S2,对这两个字符串进行子序列的比对,得到一个共同的子序列,求这个子序列的最长字符长度。如下例子:

添加图片注释,不超过 140 字(可选)

对于以上问题,如果说不使用动态规划等思路的求解,暴力求解所产生的计算量非常大,造成时间复杂度很高的后果,所以选择使用动态规划思路求解,并且使用二维动态规划,这里主要借助于一个二维数组来进行模拟。

使用一个L(i,j),这里代表的是S1字符串的前m位中的前i个字符和S2字符串的前n位的前j个字符的最长公共子序列的长度,对于该问题的状态转移方程分为3种情况,分别是,当m和n都是0的时候,则有L(m,n)=0,第二种情况是当m和n都大于0的时候,并且对应的S1的m位字符和S2的n位字符相同时,L(m,n)=L(m-1,n-1)+1,第三种情况是当m和n都大于0的时候,并且对应的S1的m位字符和S2的n位字符不相同时,L(m,n)=max(L(m,n-1),L(m-1,n))。下图为"ABCD"和"BDCA"字符串的判定最长公共子序列的长度的过程:

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

python代码实现如下:

    def longestequence(self, s1, s2):
        len1=len(s1)
        len2=len(s2)
        array=[[0]*(len2+1) for _ in range(len1+1)]
        for i in range(1,len1+1):
            for j in range(1,len2+1):
                if s1[i-1]==s2[j-1]:
                    array[i][j]=array[i-1][j-1]+1
                else:
                    array[i][j]=max(array[i][j-1],array[i-1][j])
        return array[len1][len2]

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值