算法:最长公共子序列(输出所有最长公共子序列)

article/2025/9/6 12:51:47

问题描述:给定两个序列,例如 X = “ABCBDAB”、Y = “BDCABA”,求它们的最长公共子序列的长度。

下面是求解时的动态规划表,可以看出 X 和 Y 的最长公共子序列的长度为4:
在这里插入图片描述
输出一个最长公共子序列并不难(网上很多相关代码),难点在于输出所有的最长公共子序列,因为 LCS 通常不唯一。

我们需要在动态规划表上进行回溯 —— 从c[m][n],即右下角的格子,开始进行判断:如果格子c[i][j]对应的X[i-1] == Y[j-1],则把这个字符放入 LCS 中,并跳入c[i-1][j-1]中继续进行判断;如果格子c[i][j]对应的 X[i-1] ≠ Y[j-1],则比较c[i-1][j]和c[i][j-1]的值,跳入值较大的格子继续进行判断;如果出现c[i-1][j]等于c[i][j-1]的情况,说明最长公共子序列有多个,故两边都要进行回溯(这里用到递归)。直到 i 或 j 小于等于零为止,倒序输出 LCS 。

在这里插入图片描述
从上图的红色路径显示,X 和 Y 的最长公共子序列有 3 个,分别为 “BDAB”、“BCAB”、“BCBA”。
C++代码:

#include<bits/stdc++.h>
using namespace std;string X ;
string Y ;
vector<vector<int> > c; // 动态规划表
set<string> lcs;      // set保存所有的LCSint lcs_length(int m, int n)
{// 表的大小为(m+1)*(n+1)c = vector<vector<int> >(m+1,vector<int>(n+1));for(int i=0; i<m+1; ++i){for(int j=0; j<n+1; ++j){// 第一行和第一列置0if (i == 0 || j == 0)c[i][j] = 0;else if(X[i-1] == Y[j-1])c[i][j] = c[i-1][j-1] + 1;elsec[i][j] = max(c[i-1][j], c[i][j-1]);}}return c[m][n];
}void lcs_print(int i, int j, string lcs_str)
{while (i>0 && j>0){if (X[i-1] == Y[j-1]){lcs_str.push_back(X[i-1]);
//			cout<<X[i-1]<<endl;--i;--j;}else{if (c[i-1][j] > c[i][j-1])--i;else if (c[i-1][j] < c[i][j-1])--j;else{lcs_print(i-1, j, lcs_str);lcs_print(i, j-1, lcs_str);return;}}}
//	cout<<lcs_str<<endl;reverse(lcs_str.begin(),lcs_str.end());lcs.insert(lcs_str);
}int main()
{cin>>X>>Y;int m = X.length();int n = Y.length();int length = lcs_length(m, n);cout << "The length of LCS is " << length << endl;string str;lcs_print(m, n, str);set<string>::iterator it = lcs.begin();for( ; it!=lcs.end(); it++)cout << *it << endl;return 0;
}

运行效果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/a3dqfsqW.shtml

相关文章

动态规划 最长公共子序列 过程图解

1.基本概念 首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longest common substring)不是一回事儿。什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。什么是子串呢?给定串中任意个连续的字符…

算法知识之最长公共子序列问题(动态规划)

最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X{x1,x2,…,xm},则另一序列Z{z1,z2,…,zk},是X的子序列是指存在一个严格递…

动态规划篇——最长公共子序列(c++)

引言&#xff1a;最长公共子序列属于动态规划的基础篇&#xff0c;由字符串的最长公共最序列可以引出很多的问题。 最长子序列详细讲解以及练习题目 需要详细讲解教程的可以观看上面链接的文章&#xff0c;以下是自己做的简单的概括。 一、何为最长公共子序列 A和B的公共子序…

最长公共子序列(LCS)

此文全文参考自&#xff1a;https://blog.csdn.net/dq_dm/article/details/45043689&#xff0c;特此感谢&#xff01; 然后自己参考了&#xff1a;http://www.ahathinking.com/archives/115.html 和July的ppt讲义《十分钟搞定LCS》&#xff0c;为表示版权&#xff0c;特地留下…

动态规划——最长公共子序列

先来讲解以下什么是最长公共子序列。最长公共子序列不是最长相同字符串&#xff0c;有点相似但不一样&#xff0c;来举个简单的例子&#xff0c;有字符串s1bcdea&#xff0c;s2abce&#xff0c;最长相同字符串是bc&#xff0c;最大公共部分是2&#xff1b;而最长公共子序列则是…

动态规划---例题2.最长公共子序列问题

本题与力扣主站1143题相同. 一.问题描述 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。 确切地说&#xff0c;若给定序列X<x1, x2,…, xm>&#xff0c;则另一序列Z<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik&g…

知识图谱本体建模之RDF、RDFS、OWL详解

&#xff08;一&#xff09;知识图谱本体建模之RDF、RDFS、OWL详解 1.语义网体系 知识图谱于2012年由Google提出&#xff0c;并不是新概念&#xff0c;而是由语义网络(Semantic Network)衍生而来。语义网络由相互连接的节点和边组成&#xff0c;节点表示概念或者对象&#xf…

OWL本体基础知识

备注&#xff1a; OWL本体中对象属性和数据属性都可以有进一步的注释属性&#xff0c;被称之为公理 <owl:NamedIndividual rdf:about"http://www.semanticweb.org/bob/ontologies/2022/11/untitled-ontology-20#刘二菲"><like rdf:resource"http://www…

protege系列(一):本体开发101:创建第一个本体的指南

protege作为领域本体编辑工作一直为自然语言处理和语义网、知识图谱等行业人士喜爱&#xff0c;但是还没有比较完整的官方Protege中文文档&#xff0c;本系列旨在通过对protege官方网站上教程等内容的翻译和再现&#xff0c;为广大网友提供一个全面的、权威的protege教程。 本…

动态本体 palantir

102解析器与106本体耦合&#xff0c;106本体与108数据库耦合&#xff1b; 106本体有一个或多个110对象类型和116属性类型 110对象类型实例化多个112对象 每一个对象有一个或多个属性 116属性类型实例化114A和114B属性 116属性类型有一个或多个118组件&#xff0c;组件有字符串、…

什么是计算机科学中的“本体论”

最近看用户画像&#xff0c;里面提到了本体论。故把知乎一个回答放于此地。 一、本体的概念 本体的概念有两层意思&#xff0c;一层是哲学层面的意思&#xff0c;一层是引申到信息科学中的语义层面的意思。 举个最通俗的例子来解释一下这两层意思&#xff0c;我们就拿苹果来举…

本体建模学习笔记

目录 1. 语义网 & 语义网络 1.1 链接数据与知识图谱 的区别 1.2 本体构建的两种方式 1.3 知识图谱数据的来源 0. RDF、OWL 与RDFS 0.1 RDF序列化 0.2 关系 / 属性 0.3 RDFS词汇 0.4 本体映射词汇&#xff08;Ontology Mapping&#xff09; 2. Protege实现本体建模…

知识元与知识本体

元数据&#xff08;Metadata&#xff09;就是“关于数据的数据”,是对数据进行组织和处理的基础。元数据法就是对信息单元及其集合进行规范描述从而形成元数据&#xff0c;并依其将分布式的信息资源整合成有机信息体系的基准、方法和工具。主题词表&#xff1a;也称叙词表。它是…

本体语言 OWL

万维网本体语言OWL2 文章目录 万维网本体语言OWL2一、引言二、本体语言的需求三、OWL2和RDF/RDFS的兼容性3.1 OWL2 Full&#xff1a;基于RDF的语义3.2 OWL2 DL&#xff1a;直接语义 四、OWL语言五、OWL2 概要六、实验 OWL的构造七、总结 一、引言 通俗的讲&#xff0c;RDF被限…

本体概述

目录1.定义2.本体的目标和作用3.本体构成要素4.领域本体与上层本体5.本体语言6. 构造Ontology 的规则 7.本体在信息检索的应用 1.定义 – 1991/Neches 等&#xff1a;给出构成相关领域词汇的基本术语和关系&#xff0c;以及利用这些术语和关系构成的规定这些词汇外延的规则…

本体 摘抄笔记

一、本体的一些介绍 &#xff08;来源&#xff1a;https://blog.csdn.net/shendeguang/article/details/8241164&#xff09; 1. 本体论语义学的特点&#xff1a; 本体论语义学与其他人工智能理论、自然语言加工系统相比有自己的一些鲜明特点。 其一&#xff0c;它强调对意义…

图构建:领域本体设计原则与动态本体

图构建&#xff1a;领域本体设计原则与动态本体 前文《思考总结&#xff1a;领域知识图谱平台构建与业务应用》中提到&#xff1a;“本体设计是图应用中的重中之重&#xff0c;一切的图展示、图计算、图分析、图挖掘、图模式匹配…的基础在图构建&#xff0c;而图构建的核心是…

常用本体建模工具

常用本体建模工具&#xff1a; Apollo、OntoStudio、TopBraid Composer、Semantic Turkey、Knoodl、Chimaera、OliEd、WebODE、Kmgen和DOME Protg Protg[1]是一款由斯坦福大学编写并维护的开源本体建模和编辑工具&#xff0c;其支持Web版本和PC版本&#xff0c;使用OWL语言…

本体(Ontology)

我是在撰写毕业论文中接触到知识表示方面的内容&#xff0c;有时需要理论与实践相结合&#xff0c;关于这方面的理论知识学习&#xff0c;除了网页资料、书籍、另外推荐一个网站&#xff1a;熊猫学术(https://sc.panda321.com/)&#xff0c;可以查阅很多相关的学术论文&#xf…

知识图谱初步学习(一)——本体+Protege新手学习

文章目录 前言&#xff08;本体详解&#xff09;1.本体概念2.本体分类3.本体组成4.本体构建方法5.本体构建的原则6.本体应用 一、protege简介二、软件使用步骤1.安装2.使用3.案例 三、问题解决方案汇总 前言&#xff08;本体详解&#xff09; 在开始学习知识图谱的过程中&…