【Python】算法设计之【动态规划】——最大子序列问题(LCS算法)

借鉴博客:https://blog.csdn.net/Scofield971031/article/details/89027314
代码如下:

def LCS(a,b):
    n = len(a) + 1  # s辅助空间(二维数组)的长宽
    m = len(b) + 1  # 加1是因为算法还需要一横一竖两列0来辅助
    L = [[0] * m for i in range(n)]  # 创建辅助空间(二维数组)并初始化全部元素为0
    S = [[0] * m for i in range(n)]  # 标记数组
    for i in range(n):
        L[i][0] = 0  # 辅助列
    for j in range(m):
        L[0][j] = 0  # 辅助行
    for i in range(1,n):    # 计数模块
        for j in range(1,m):
            if a[i-1] == b[j-1]:
                L[i][j] = L[i-1][j-1] + 1 # 发现相等,计数器加一
                S[i][j] = 'ok'  # 标记为ok
            elif L[i][j-1] > L[i-1][j]:
                L[i][j] = L[i][j-1]   # 左值大于上值,则取左
                S[i][j] = 'left'  # 标记为左
            else:
                L[i][j] = L[i-1][j]   # 左值小于上值,则取上
                S[i][j] = 'up'  # 标记为上
    i,j = len(a), len(b)  # 开始迭代
    Str = []  # 存放LCS
    while L[i][j]:      # 求LCS模块
        temp = S[i][j]
        if temp == 'ok':   # 从右下往左上,一路找
            Str.append(a[i-1])  # 找到了就存起来
            i -= 1
            j -= 1       # 向左上角找下一个
        if temp == 'left':
            j -= 1  # 向左找
        if temp == 'up':
            i -= 1  # 向上找
    Str.reverse()  # 反过来
    c = "".join(Str)  # 变成字符串
    Ret = [L[n-1][m-1], c]   # 用来返回的数组,内装最大公子序列和长度
    return Ret


if __name__ == "__main__":
    print("字符串xzyzzyx和zxyyzxz的最长公共子序列为",LCS("xzyzzyx","zxyyzxz")[1],"长度为",LCS("xzyzzyx","zxyyzxz")[0])

运行结果:字符串xzyzzyx和zxyyzxz的最长公共子序列为 xyzz 长度为 4

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值