我是靠谱客的博主 靓丽老虎,最近开发中收集的这篇文章主要介绍【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

最后

以上就是靓丽老虎为你收集整理的【Python】算法设计之【动态规划】——最大子序列问题(LCS算法)的全部内容,希望文章能够帮你解决【Python】算法设计之【动态规划】——最大子序列问题(LCS算法)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部