8.最长公共子序列问题

news/2024/11/23 23:38:11/

title: 8.最长公共子序列问题
date: 2023-05-02 15:52:40
categories:

  • 大学课程内容
  • 大二下
  • 算法分析基础

8.最长公共子序列问题

【问题描述】

若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。如果给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。现给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},要求使用动态规划算法思想,找出X和Y的最长公共子序列。

【输入形式】

输入以空格分割的字符,第一行对应第一条序列,第二行对应第二条序列。

【输出形式】

字符数组形式的最长公共子序列。

【样例输入】

z x y
x y y

【样例输出】

['x', 'y'] 

【样例说明】

第一行输入为第一条序列,包含z x y三个字符;输出为最长公共子序列,包含两个字符,以数组形式输出。

思路

动态规划:

  • 状态表示:dp[i][j]表示a的[0i]和b的[0j]的最长公共子序列的长度的最大值
  • 状态计算:
    • 如果a[i]==a[j],则dp[i][j]=dp[i-1][j-1]+1
    • 否则,dp[i][j]=max(dp[i-1][j],dp[i][j-1])

代码

a = input().split()
b = input().split()
n, m = len(a), len(b)
# dp[i][j]表示a[0:i]和b[0:j]的最长公共子序列长度
dp = [[0 for i in range(m + 1)] for j in range(n + 1)]for i in range(1, n + 1):for j in range(1, m + 1):if a[i - 1] == b[j - 1]:  # a[i - 1]和b[j - 1]相等,那么dp[i][j]就是dp[i - 1][j - 1] + 1dp[i][j] = dp[i - 1][j - 1] + 1else:  # a[i - 1]和b[j - 1]不相等,那么dp[i][j]就是dp[i - 1][j]和dp[i][j - 1]的最大值dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
# 回溯  输出最长公共子序列
res = []
i = n
j = m
while i > 0 and j > 0:if a[i - 1] == b[j - 1]:  # a[i - 1]和b[j - 1]相等,那么a[i - 1]就是最长公共子序列的一个元素res.append(a[i - 1])i -= 1j -= 1elif dp[i - 1][j] > dp[i][j - 1]:  # a[i - 1]和b[j - 1]不相等,那么dp[i][j]就是dp[i - 1][j]和dp[i][j - 1]的最大值i -= 1else:j -= 1
res.reverse()
print(res)

http://www.ppmy.cn/news/63652.html

相关文章

前端学习之使用JavaScript(3)

BOM BOM BOM(Browser Object Model,浏览器对象模型)是JavaScript中用于与浏览器窗口及其元素进行交互的API。 BOM提供了一系列对象,这些对象代表了浏览器的不同部分,使得开发者能够控制浏览器的各种功能,如…

qt creator添加build步骤删除某个文件

参考:https://blog.csdn.net/weixin_44436546/article/details/113587115 1. windows下配置: 添加build步骤;在commad栏输入cmd,会弹出C:\Windows\system32\cmd.exe;在Arguments栏输入/c release\upgrade.o;Working …

原型模式--深拷贝和浅拷贝

定义 Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype. (使用原型实例指定将要创建的对象类型,通过复制这个实例创建新的对象。) 从定义中我们我们可以发现&#x…

基数树RadixTree

转自:基数树RadixTree - 知乎 1. 基数树概述 对于长整型数据的映射,如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题。radix树就是针对这种稀疏的长整型数据查找,能快速且节省空间地完成映射。借助于Radix树,我们可以实现…

SpringBoot整合接口管理工具Swagger

Swagger Swagger简介 Springboot整合swagger Swagger 常用注解 一、Swagger简介 ​ Swagger 是一系列 RESTful API 的工具,通过 Swagger 可以获得项目的⼀种交互式文档,客户端 SDK 的自动生成等功能。 ​ Swagger 的目标是为 REST APIs 定义一个标…

嵌入式软考备考_5 安全性基础知识

安全性基础知识 网安问题概述 被动攻击:监听(截获)。 主动攻击:主动破坏(中断篡改,病毒,ddos使得某个服务拒绝服务,重放攻击:黑客截取了正常用户输入用户名密码的加密…

Spring Boot 整合 Swagger 教程详解

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

3. SQL底层执行原理详解

一条SQL在MySQL中是如何执行的 1. MySQL的内部组件结构1.1 Server层1.2 Store层 2. 连接器3. 分析器4. 优化器5. 执行器6. bin-log归档 本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。 1. MySQL的内部组件结…