首页 > 其他分享 >动态规划--最长公共子序列( LCS 问题)

动态规划--最长公共子序列( LCS 问题)

时间:2023-08-19 20:33:24浏览次数:32  
标签:LCS -- 左上方 len print range 序列 lcs

博客地址:https://www.cnblogs.com/zylyehuo/

# -*- coding: utf-8 -*-

# 最长公共子序列的长度
def lcs_length(x, y):
    m = len(x)
    n = len(y)
    c = [[0 for _ in range(n + 1)] for _ in range(m + 1)]
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if x[i - 1] == y[j - 1]:  # i j 位置上的字符匹配的时候,来自于左上方+1
                c[i][j] = c[i - 1][j - 1] + 1
            else:
                c[i][j] = max(c[i - 1][j], c[i][j - 1])
    for _ in c:
        print(_)
    return c[m][n]


print("==========================最长公共子序列的长度==========================")
print(f'最长公共子序列的长度为:{lcs_length("ABCBDAB", "BDCABA")}')


def lcs(x, y):
    m = len(x)
    n = len(y)
    c = [[0 for _ in range(n + 1)] for _ in range(m + 1)]
    b = [[0 for _ in range(n + 1)] for _ in range(m + 1)]  # 1 左上方 2 上方 3 左方
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if x[i - 1] == y[j - 1]:  # i j 位置上的字符匹配的时候,来自于左上方+1
                c[i][j] = c[i - 1][j - 1] + 1
                b[i][j] = 1
            elif c[i - 1][j] > c[i][j - 1]:  # 来自于上方
                c[i][j] = c[i - 1][j]
                b[i][j] = 2
            else:
                c[i][j] = c[i][j - 1]
                b[i][j] = 3
    return c[m][n], b


def lcs_trackback(x, y):
    c, b = lcs(x, y)
    for _ in b:
        print(_)
    i = len(x)
    j = len(y)
    res = []
    while i > 0 and j > 0:
        if b[i][j] == 1:  # 来自左上方=>匹配
            res.append(x[i - 1])
            i -= 1
            j -= 1
        elif b[i][j] == 2:  # 来自于上方=>不匹配
            i -= 1
        else:  # ==3 来自于左方=>不匹配
            j -= 1
    return "".join(reversed(res))


print("===============================最长公共子序列===============================")
print(lcs_trackback("ABCBDAB", "BDCABA"))

标签:LCS,--,左上方,len,print,range,序列,lcs
From: https://www.cnblogs.com/zylyehuo/p/17643050.html

相关文章

  • 《剑指Offer》-40-最小的 K 个数
    如果直接调用sortAPI然后要几个打印几个就没意思了,应该是和某个排序的内部过程结合首先排除O(N2)的低效率排序算法,最先想到的其实是堆排序,小根堆,但是需要额外的空间其次像快排、归并这样的也不合适……我想到了可以这样,快排第一轮划分之后,将部分舍去……应该就是这样了,堆排......
  • Python分享之python super()
    一、问题的发现与提出在Python类的方法(method)中,要调用父类的某个方法,在Python2.2以前,通常的写法如代码段1:代码段1:classA:def__init__(self):print"enterA"print"leaveA"classB(A):def__init__(self):print"enterB"A.__init__(self)print......
  • MySQL基本SQL语句1(DDL)
    前言SQL(StructuredQueryLanguage)结构化查询语言,用于存取,查询,更新数据以及管理关系型数据库系统SQL指令分为四类DDL        DataDefintionlanguage数据库定义语言                用于完成对数据库对象(数据表,数据库,视图,索引)的创建,删除,修改DML......
  • MySQL基本SQL语句1(DDL)
    前言SQL(StructuredQueryLanguage)结构化查询语言,用于存取,查询,更新数据以及管理关系型数据库系统SQL指令分为四类DDL        DataDefintionlanguage数据库定义语言                用于完成对数据库对象(数据表,数据库,视图,索引)的创建,删除,修改DML......
  • lambda
    在Java8中,引入了一种新的语法特性——Lambda表达式。Lambda表达式允许开发者以更简洁、更直观的方式编写代码,尤其在函数式编程和集合数据处理方面表现出色。它的引入大大提升了Java语言的表达能力和代码可读性。在本文中,我们将深入探讨JavaLambda表达式的概念、语法和实际应用。......
  • 【Oracle RAC Database】Single Client Access Name(SCAN)
    SCAN的作用是简化客户端连接数据库的配置,无论集群增加还是删除节点SCAN名称会一直保持不变,客户端不需要做任何的修改。SCAN是一个名称,通过DNS被解析成最多3个IP地址(SCANVIP)SCANVIP的作用是接收客户端连接,SCANVIP必须与集群的公网资源处于相同的子网,每一个SCANVIP都会有对应的S......
  • Python学习 -- 高阶、闭包、回调、偏函数与装饰器探究
    Python函数作为编程的核心,涵盖了众多令人兴奋的概念,如高阶函数、闭包、回调、偏函数和装饰器。本篇博客将深入研究这些概念,结合实际案例为你解析函数的精妙,以及如何巧妙地运用它们来构建更强大、灵活的程序。高阶函数:进一步探索在上文基础上,再次回顾高阶函数,展示它们如何将函数作为......
  • QINQ技术
    概述随着以太网技术在网络中的大量部署,利用vlan对用户进行隔离和标识受到很大限制。因为IEEE802.1Q中定义的vlantag域只有12个bit,仅能标识4094个VLAN,无法满足城域以太网中标识大量用户的需求,于是QINQ技术应运而生QINQ(802.1QIN801.1Q)技术是一项扩展VLAN空间的技术,通过在802.1Q标......
  • tracer ftrace笔记(20)—— Systrace中tag汇总
    一、视频显示1.HW_VSYNC_ON_XXX(1)类型布尔值,1表示HWVSYNC信号开关被打开,0表示开关被关闭。(2)时机HWVYSNC硬件信号被打开和关闭的时候。(3)解释HW_VSYNC_ON_XXX后面的XXX一般是一串数字,代表的是displayid,如果你的机器有外接了显示器,那么可以通过displayid......
  • Widget、Element、RenderObject三者之间的关系
     Widget不是真正渲染UI的对象,它只是Element的一个配置描述,去通知Element应该如何去渲染,Widget和Element之间是⼀对一的关系Element持有RenderObject和Widget。RenderObject才是实际渲染的对象,三者的关系是:配置⽂件Widget⽣成了Element,⽽后创建RenderObject关联到Element......