最长公共子序列算法python

本文介绍了一种使用空间优化动态规划算法求解两个字符串的最长公共子序列(LCS)的方法。该算法通过减少所需的空间复杂度至O(min(a,b))+1,实现了对传统动态规划算法的有效改进。

动态规划(空间优化):

def LCS(a, b):
    """ 最长公共子序列 空间复杂度为O(min(a,b))+1  记录左上角值"""
    if len(a) < len(b):
        a, b = b, a
    print(a, b)
    list = [0 for i in range(len(b))]
    for i in range(len(a)):
        upperleft = 0
        for j in range(len(b)):
            if a[i] == b[j]:
                upperleft, list[j] = list[j], upperleft+1
                # 记住修改之前list[j]的值,为了下次作为左上角的值使用
            else:
                upperleft = list[j]
                # 记住修改之前list[j]的值,为了下次作为左上角的值使用
                list[j] = (max(list[j], list[j-1]) if j != 0 else list[j])
        print(list)
    return list[-1]


def main():
    # a="67824681"
    # b="123456789"
    a = input("Please input one string:")
    print("Your enter is : ", a)
    b = input("Please input another string:")
    print("Your enter is : ", b)
    print("The longth of the longest common subsequence is :", LCS(a, b))

  
if __name__ == '__main__':
    main()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值