输出所有最长公共子序列

news2024/11/24 20:56:23

输出所有最长公共子序列

  • 什么是最长公共子序列
  • 过程讲解
  • 完整程序代码(python)

什么是最长公共子序列

在力扣题库中的1143题有一道最长公共子序列,但是那个只是返回最长子序列的长度,而没有输出所有的最长子序列
在这里插入图片描述
通过上图中的举例我们可以看出子序列是可以不连续的但是前后关系是不能变的

过程讲解

链接: b站一个关于最长子秩序的讲解视频
在这里插入图片描述

我们假设两个序列 s1 = "abcbdab"s2 = "bdcabc"去求它们两个的最长公共子序列
首先我们假定D[ i ][ j ]的值是s1前 i 个字符和s2前 j 个字符的LCS(最长公共子序列)
首先讨论D[i][j]的值

  1. 如果s1的第 i 个字符和s2的第 j 个字符相等那么D[ i ][ j ]等于s1前 i-1 个字符和s2前 j-1 个字符的LCS的值加 1 即D[ i ][ j ] = 1+D[ i-1 ][ j-1 ]
  2. 如果s1的第 i 个字符和s2的第 j 个字符不相等那么D[ i ][ j ]等于s1前 i-1 个字符和s2前 j 个字符的LCS的值和s1前 i 个字符和s2前 j-1 个字符的LCS的值中的最大值。
  3. 如果 i 或 j 等于0那么此时 D[ i ][ j ] = 0,因为 i 和 j 其中一个为0的话就是一个空序列,那么空序列与其他序列的最长公共子序列为0.

那么根据上述描述的关系就可以构建 D[ i ][ j ]
在这里插入图片描述
序列 s1 = "abcbdab"s2 = "bdcabc"的长度分别为7和6那么我们构建的二维数组D应该是8*7的因为这样我们才能使D[ i ][ j ]的值是s1前 i 个字符和s2前 j 个字符的LCS(最长公共子序列)

  1. 首先在第0行和第0列肯定都是0,因为是我们上面讨论的第三条
  2. 然后看第1行第1列,s1中的字符与s2中的字符不相等所以取左边和上边的最大值,是我们上面讨论的第二条所以这里为0
  3. 然后同理第第1行第2列与第1行第3列都是0,在第1行第4列时,s1中的字符与s2中的字符相等所以此处的值为D[ i-1 ][ j-1 ]的值+1,是我们上面讨论的第一条
  4. 然后再看第1行第5列s1中的字符与s2中的字符不相等所以取左边和上边的最大值,所以此处值为1,其他的类似直到把这个二维矩阵填满。

回溯输出所有最长公共子序列
在这里插入图片描述
回溯时从最后二维数组的最后一个值开始,这个值就是我们的最长子序列的长度

  1. 首先看当前m行n列中s1[ m-1 ]与s2[ n-1 ]的值是否相等,如果相等则这个值就是我们最长子序列中的值
  2. 如果当前m行n列中s1[ m-1 ]与s2[ n-1 ]的值不相等,则比较左边和上方的值哪个和现在的值相等,相等则说明当前下标的值是从它过来的
  3. 当m行n列中s1[ m-1 ]与s2[ n-1 ]的值不相等且左边和上方的值相等时,需要在此处分叉,因为当前的值可以从它们两个中的任意一个过来

完整程序代码(python)

代码参考:链接: 【动态规划】输出两个序列的所有的最长公共子序列(java)

class Solution:
    def __init__(self, text1: str, text2: str):
        self.text1 = text1	#输入第一个序列
        self.text2 = text2	#输入第二个序列
        self.m, self.n = len(text1), len(text2)	#m,n分别代表第一个序列和第二个序列的长度
        self.arr = [[0 for j in range(self.n+1)] for i in range(self.m+1)]  # 创建一个m*n的矩阵c并初始化元素为0
        self.set1 = set()		#创建一个集合用来存储所有的最长子序列
        for i in range(1,self.m + 1):	#用两个for循环来对二维矩阵arr填值
            for j in range(1,self.n+ 1):
                if self.text1[i-1] == self.text2[j-1]:	#两个序列当前值相等的话取i-1和j-1的值+1,我们讨论的第一条
                    self.arr[i][j] = self.arr[i-1][j-1]+1
                else:									#不相等的话取左边和上边的最大值,我们讨论的第二条
                    self.arr[i][j] = max(self.arr[i][j-1],self.arr[i-1][j])
        print(self.arr)						#打印一下这个二维数组

    def longestCommonSubsequence(self,i,j,s):#i是行,j是列,s是字符串
        while i>0 and j>0:							#回溯
            if self.text1[i-1] == self.text2[j-1]:		#回溯中的第一个
                s += self.text1[i-1]
                i -= 1
                j -= 1
            elif self.arr[i-1][j] > self.arr[i][j-1]:	#回溯中的第二个
                i -= 1
            elif self.arr[i-1][j] < self.arr[i][j-1]:	#回溯中的第二个
                j -= 1
            else:										#最后一种情况就是回溯中讨论的第三个出现分叉
                self.longestCommonSubsequence(i-1, j, s)
                self.longestCommonSubsequence(i, j-1, s)
                break;									#分叉后让当前跳出循环,让两条分叉去分别递归
        if len(s) == self.arr[-1][-1]:					#如果当前回溯的字符串长度等于最长子序列的长度则把它加入到集合中
            self.set1.add(s[::-1])


print("请输入第一个序列")
list1 = input()			#读取第一个列表
print("请输入第二个序列")
list2 = input()			#读取第二个列表
s1 = Solution(list1,list2)	#创建一个对象
s1.longestCommonSubsequence(len(list1),len(list2),"")	#调用最长子序列的函数
print(s1.set1)		#输出集合中所有的最长子序列

#abcbdab
#bdcabc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1191392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VR全景技术,为养老院宣传推广带来全新变革

现如今&#xff0c;人口老龄化的现象加剧&#xff0c;养老服务行业也如雨后春笋般不断冒头&#xff0c;但是市面上各式的养老院被包装的五花八门&#xff0c;用户实际参访后却差强人意&#xff0c;如何更好的给父母挑选更为舒心的养老环境呢&#xff1f;可以利用720度VR全景技术…

响应式艺术作品展示前端html网站模板源码

响应式艺术作品展示网站模板是一款适合各种艺术作品在线展示的响应式网站模板下载。提示&#xff1a;本模板调用到谷歌字体库&#xff0c;可能会出现页面打开比较缓慢。 转载自 https://www.qnziyw.cn/wysc/qdmb/23778.html

文献管理软件Zotero之同步篇(2)

文章目录 0、前言1、官方自带同步1.1、Zotero的同步逻辑【必须掌握】1.2、自带同步设置 2、官网进行数据同步&#xff0c;同步网盘进行文件同步的方案2.1、对1.1同步逻辑的补充说明2.2、同步设置2.2.1、同步网盘的选择&#xff1a;2.2.2、同步设置2.2.2.1、分别在每一台计算机中…

JMeter参数化方式:三招让你的性能测试更灵活!

科技新势力&#xff0c;引领向未来 今天我们将探讨关于JMeter&#xff08;Apache JMeter&#xff09;性能测试工具中的参数化方式&#xff0c;这些方法可以帮助你更灵活地进行性能测试&#xff0c;并更好地模拟实际用户行为。JMeter是一款强大的开源工具&#xff0c;可用于测试…

R-install_miniconda()卸载 | conda命令行报错及解决方法

运行以下代码&#xff0c;突然报错&#xff1a; C:\Users\hp>conda info-e >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<<<<<<<<<<<<<<<&…

AI:74-基于深度学习的宠物品种识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

VScode 右键没有转到定义等的菜单

问题&#xff1a; 右键点击该函数出现的结果只能是这样的&#xff1a; 解决&#xff1a; 通过修改 settings.json 文件&#xff0c;以解决问题&#xff1a; 这是原来有问题的配置&#xff1a; {"python.autoComplete.extraPaths": ["/home/robot/1-temp_mak…

【Linux】 reboot 命令使用

reboot 命令用于用来重新启动计算机。 语法 reboot [参数] 命令选项及作用 执行令 man --reboot 执行命令结果 参数 -n : 在重开机前不做将记忆体资料写回硬盘的动作-w : 并不会真的重开机&#xff0c;只是把记录写到 /var/log/wtmp 档案里-d : 不把记录写到 /var/log…

锁策略与CAS

目录 ♫什么是锁策略 ♫乐观锁与悲观锁 ♫互斥锁和读写锁 ♫重量级锁和轻量级锁 ♫自旋锁和挂起等待锁 ♫公平锁和非公平锁 ♫可重入锁和不可重入锁 ♫什么是CAS ♫CAS实现原子类 ♫CAS实现自旋锁 ♫CAS的ABA问题 ♫什么是锁策略 锁策略指的是在并发访问数据时&#xf…

创建一个自定义关卡资源(二)

接上一篇文章&#xff0c;做加载 再做加载之前&#xff0c;提一下 关于上一篇文章中的扩展编辑器&#xff0c;会有点小问题&#xff0c;会有重置的现象&#xff0c;现在有点忙&#xff0c;暂时不研究。 如果研究的话&#xff0c;我会出一篇&#xff08;三&#xff09; 否则就没…

哈希的介绍及开散列和闭散列的实现(c++)

本文主要对哈希的相关知识进行一定的介绍&#xff0c;并对哈希中结构的闭散列和开散列进行一定的介绍和部分功能的实现。 目录 一、哈希概念 二、哈希冲突 三、哈希函数 1. 直接定址法--(常用) 2. 除留余数法--(常用) 3. 平方取中法 4. 折叠法 5. 随机数法 6. 数学分析…

利用servlet实现对书籍书名、单价、数量等信息的添加,计算总价

1.题目要求 利用servlet实现对书籍书名、单价、数量等信息的添加&#xff0c;计算总价。 要求&#xff1a;输入两次表单信息&#xff0c;在一个成功返回的页面里面显示两次的数据。 2.Book实体类 package com.hjj.sevletgk.hw7.book;/*** author:嘉佳 Date:2023/10/8 15:16*…

Spring 常见面试题

1、Spring概述 1.1、Spring是什么? Spring是一个轻量级Java开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题Spring最根本的使命是解决企业级应用开发的复杂性&#xff0c;即简化Java开发。这些功能的底层都依赖于它的两个核心特性&#xff0c;也就是…

Html 引入element UI + vue3 报错Failed to resolve component: el-button

问题&#xff1a;Html 引入element UI vue3 &#xff0c;el-button效果不出来 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import Vue before Element --> <!-- <script src"https://unpkg.com/vue2/dist…

每次重启完IDEA,application.properties文件里的中文变成?

出现这种情况&#xff0c;在IDEA打开Settings-->Editor-->File Encodings 然后&#xff0c;你需要将问号改为你需要的汉字。 重启IDEA&#xff0c;再次查看你的.properties文件就会发现再没有变成问号了

k8s 配置资源管理

配置资源管理 //Secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源&#xff0c;这类数据虽然也可以存放在 Pod 或者镜像中&#xff0c;但是放在 Secret 中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。 有三种类型&#xff1a; ●kubernetes.…

Docker容器 虚拟化技术

Docker容器 1、容器化技术的由来 虚拟化技术发展已经非常强大了&#xff0c;那为什么还需要容器化技术呢&#xff1f; 如今的虚拟机解决了基础设计计算&#xff0c;网络&#xff0c;存储着几个方面的弹性&#xff0c;可以非常方便的扩展出应用的资源&#xff0c;但是仍然存在…

网页分析和xml.etree库

源代码&#xff1a; Lib/xml/etree/ElementTree.py 该xml.etree.ElementTree模块实现了一个简单高效的 API&#xff0c;用于解析和创建 XML 数据。 一、说明 这是一个简短的使用教程xml.etree.ElementTree&#xff08;ET简而言之&#xff09;。目标是演示该模块的一些构建块和基…

本地部署企业邮箱,让企业办公更安全高效

随着信息化时代的到来&#xff0c;企业邮箱几乎成了企业办公的标配&#xff0c;承载着企业业务往来和办公协同的重要职能。基于安全性、个性化需求、系统集成等方面的需要&#xff0c;许多企业选择本地部署企业邮箱&#xff0c;本地化部署不仅能有效保障企业信息安全的同时&…

【python小游戏】飞机大作战源码分享(附完整源码+图片资源可直接运行)

效果演示 源码 plane_main1.py import pygame from plane_sprites import * import timeclass PlaneGame(object):"""飞机大战主游戏"""def __init__(self):print("游戏初始化")# 1. 创建游戏的窗口self.screen pygame.display.set…