当前位置: 首页 > 编程日记 > 正文

java实现最长连续子序列_最长公共子序列 ||

问题:在 前一篇文章 最长公共子序列 | 的基础上要求将所有的最长公共子序列打印出来,因为最长公共子序列可能不只一种。

难点:输出一个最长公共子序列并不难,难点在于输出所有的最长公共子序列,我们需要在动态规划表上进行回溯——从C[a][b],即右下角的格子开始判断:

1) 如果格子C[i][j]对应的X[i-1] == Y[j-1],则把这个字符放入 LCS 中,并跳入C[i-1][j-1]中继续进行判断;

2) 如果格子C[i][j]对应的X[i-1] ≠ Y[j-1],则比较C[i-1][j]和C[i][j-1]的值,跳入值较大的格子继续进行判断;

3)直到 i 或 j 小于等于零为止,倒序输出 LCS 。如果出现C[i-1][j]等于C[i][j-1]的情况,说明最长公共子序列有多个,故两边都要进行回溯。

举下面这个例子:x[6]={'B','D','C','A','B','A'}, y[7]={'A','B','C','B','D','A','B'}

通过LCSLength函数我们可以得到C表:如下表所示。

a78e5234917adbd4b1686aa742b4de0b.png

从最右下角我们可以知道最长公共子序列的长度为4,(从0开始编号)从最右下角的元素开始,C[6][7]行列元素对应A!=B,所以不加到 lcs_str(最长公共子序列串),然后考虑C[6][7](行列元素相等)和C[5][7](行列元素相等),而且C[6][7]大小等于C[5][7],所以分别从C[6][7]和C[5][7]开始同样的操作,最后找到三条路径,如上图红线标注,对应为BCAB、BCBA、BDAB。

代码如下:

#include<iostream>
#include <fstream>
#include <cassert>
#include <string>
#include <sstream>
#include <set>
using namespace std;int c[100][100];
int d[100][100];
set<string> setOfLCS;string Reverse(string str)
{int low=0;int high=str.length()-1;while(low<high){char temp=str[low];str[low]=str[high];str[high]=temp;++low;--high;}return str;
}void LCSLength(int m,int n,char *x,char *y)
{int i,j;for(i=1;i<=m;i++)c[i][0]=0;for(i=1;i<=n;i++)c[0][i]=0;for(i=1;i<=m;i++){for(j=1;j<=n;j++){if(x[i]==y[j]){c[i][j]=c[i-1][j-1]+1;d[i][j]=1;}else if(c[i-1][j]>c[i][j-1]){c[i][j]=c[i-1][j];d[i][j]=2;}else{c[i][j]=c[i][j-1];d[i][j]=3;}}}
}void traceBack(int i,int j,char *x,char *y,string lcs_str)
{while(i>0&&j>0){if(x[i]==y[j]){lcs_str.push_back(x[i]);--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{traceBack(i-1,j,x,y,lcs_str);traceBack(i,j-1,x,y,lcs_str);return;}}}setOfLCS.insert(Reverse(lcs_str));
}void LCS(int i,int j,char *x)
{if(i==0||j==0)return;if(d[i][j]==1){LCS(i-1,j-1,x);cout<<x[i];}else if(d[i][j]==2)LCS(i-1,j,x);elseLCS(i,j-1,x);
}void readTxt(string file)
{ifstream infile;infile.open(file.data());assert(infile.is_open());string s;getline(infile,s);int n=atoi(s.c_str());int num=1;while(n--){getline(infile,s);istringstream tmp(s);tmp>>s;int a=atoi(s.c_str());tmp>>s;int b=atoi(s.c_str());getline(infile,s);istringstream t1(s);char x[a];char t;for(int i=1;i<=a;i++){t1>>t;x[i]=t;}for(int i=1;i<=a;i++)cout<<x[i]<<" ";cout<<endl;getline(infile,s);istringstream t2(s);char y[b];for(int i=1;i<=b;i++){t2>>t;y[i]=t;}for(int i=1;i<=b;i++)cout<<y[i]<<" ";cout<<endl;cout<<"Case "<<num++<<endl;LCSLength(a,b,x,y);cout<<c[a][b]<<" ";cout<<"LCS(X,Y):";//LCS(a,b,x);cout<<endl;string str;setOfLCS.clear();traceBack(a,b,x,y,str);set<string>::iterator beg = setOfLCS.begin();for( ; beg!=setOfLCS.end(); ++beg)cout << *beg << endl;for(int i=0;i<=b;i++){for(int j=0;j<=a;j++){cout<<c[j][i]<<" ";}cout<<endl;}}infile.close();
}int main()
{readTxt("input.txt");return 0;
}

txt文件输入如下:

558d6cd34246126c456680136a0de7ed.png

运行结果如下:

df99d50476f49391abc791ae000e44d1.png

相关文章:

替换元素和非替换元素的学习

替换元素和非替换元素的学习 (元素)[妙瞳] 引言 元素是文档结构的基础&#xff0c;在CSS中&#xff0c;每个元素生成了一个包含了元素内容的框&#xff08;box,也翻译为“盒子”&#xff09;。但是不同的元素显示的方式会有所不同&#xff0c;例如div和span不同&#xff0c;而s…

第十六天-企业应用架构模式-离线并发模式

1.乐观离线锁 &#xff08;Optimistic Offline Lock&#xff09; 运行机制 使用时机 例&#xff1a;领域层与数据层数据映射器 2.悲观离线锁 &#xff08;Pessimistic Offline Lock&#xff09; 运行机制 使用时机 例&#xff1a;简单锁管理对象 3.粗粒度锁 &#xff08;Coarse…

hdu1518 bjfuoj1042 zoj1909 poj2362 经典的搜索加剪枝

bjfuoj的测试数据最水&#xff0c;用很简单的方法一下就过了&#xff0c;又调了好长时间&#xff0c;才过掉其它OJ上的这道题目~ /* * hdu1518/win.cpp * Created on: 2011-11-8 * Author : ben*/#include <cstdio>#include <cstdlib>#include <cstring>#…

投影参数_智能投影仪参数如何去看,其实很简单

我又来给大家安利投影仪了&#xff0c;毕竟用过的都知道有多刺激&#xff0c;但是估计很多人看到参数就头疼了吧&#xff1f;所以话不多说&#xff0c;直接上科普啦流明亮度流明怎么算的&#xff0c;家人们就不用详细了解了&#xff0c;只用记住&#xff0c;流明越高画面就越亮…

zoj 3554 A Miser Boss

题意&#xff1a;有a、b、c三个人同时工作&#xff0c;三个人做不同的任务需要不同的时间&#xff0c;但最后要求三个人做事情的总时间相同&#xff0c;输出做完所有任务需要的最少时间&#xff0c;如果无法达到三个人总工作时间相同&#xff0c;则输出“No” 当时一股脑筋觉着…

二进制_Kubernetes集群二进制部署

一、环境规划操作系统&#xff1a;CentOS7.4_x64kubernetes安装目录&#xff1a;/opt/kubernetes版本说明&#xff1a;Kubernetes&#xff1a;v1.9Docker&#xff1a;v17.12.0-ceEtcd&#xff1a;3.1二、安装Docker在所有节点执行&#xff1a;setenforce 0iptables -Fiptables …

delphi对窗体的查询(delphi xe2)

1、显示所有窗口的标题 2、根据关键字查询窗口 3、某一窗口内的所有控件及其内容 . unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;typeTFo…

Buffer的工作方式

1、Buffer的工作方式  前面《java NIO的工作方式》介绍了Selector检测到通信信道I/O有数据传输时&#xff0c;通过select()方法取得SocketChannel&#xff0c;将数据读取或写入Buffer缓冲区&#xff0c;下面讨论Buffer如何接受和写出数据。通过查看JDK源码可知道&#xff0c;…

PHP 相关配置

2019独角兽企业重金招聘Python工程师标准>>> 1. php-fpm的pool 编辑php-fpm配置文件php-fpm.convim /usr/local/php/etc/php-fpm.conf //在[global]部分增加以下内容include etc/php-fpm.d/*.conf # 相当与Nginx的虚拟主机文件 “vhost” 的配置 创建存放pool配置…

学生教育云平台登录入口_湖南省教育云平台登录入口

湖南省教育云平台官方网站http://www.hnzyzx.com/&#xff0c;好学网的中小学频道为学友整理。 湖南省教育网&#xff1a; 点击登录&#xff1a; 湖南省教育云平台登录系统 下方为湖南信息教育云平台登录入口图示&#xff1a;安全教育平台学生姓名错误处理方法…

flash中制的SWC组件怎样导入到flex中使用

flash中制的SWC组件怎样导入到flex中使用2010-04-30 11:18在使用FLASH导出SWC组件文件后&#xff0c;放入项目的LIB文件夹&#xff0c;然后要用实例化一个对象才能进行时操作使用&#xff0c; 但要记得的是&#xff0c;导出时候要再导出的组件处勾选链接&#xff0c;勾选为AS导…

开源智能手机 Librem 5 跳票了,推迟至第3季度发布

百度智能云 云生态狂欢季 热门云产品1折起>>> 由 Purism 公司打造的开源智能手机 Librem 5 原计划于2019年4月正式发布。但根据官方最新的消息&#xff0c;Librem 5 将推迟至2019年第3季度发货。 根据之前的消息&#xff0c;Librem 5 的预售价为 599 美元。 Librem …

js 获取URL后面的参数

1、有时间由于缓存问题&#xff0c;用PHP可能就不是太好处理&#xff0c;所以可以用客户端进行URL的处理 如下&#xff1a;js 获取URL后面的参数 <script> function getUrlParam(name) { //获取url参数 var reg new RegExp("(^|&)" name "([^&…

机械键盘恢复出厂fn_黑爵毛茸茸系列机械键盘评测

写在前面之前试用过黑爵的巧克力键盘&#xff0c;给我留下了挺不错的使用体验&#xff0c;不仅外观设计上好看&#xff0c;原厂Cherry轴体手感也不错&#xff0c;这次有幸体验到黑爵新品毛茸茸系列键盘实属荣幸。开箱学弟这次拿到的键盘是Cherry青轴&#xff0c;可能是快递有些…

centos防火墙端口配置

增加防火墙配置&#xff0c;允许8080端口&#xff1a; # vi /etc/sysconfig/iptables 在允许ssh的下面增加一条&#xff1a; -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT 保存&#xff0c;重启iptables服务 &#xff1a; # service iptables restart…

实时智能决策引擎在蚂蚁金服风险管理中的实践

摘要&#xff1a;以“数字金融新原力(The New Force of Digital Finance)”为主题&#xff0c;蚂蚁金服ATEC城市峰会于2019年1月4日上海如期举办。金融智能专场分论坛上&#xff0c;蚂蚁金服数据技术专家王修坤做了主题为《实时智能决策引擎在蚂蚁金服风险管理中的实践》的精彩…

JAVA如何检测GC日志

只需要在JAVA程序运行的时候&#xff0c;加上VM参数就可以。像下面这样: -XX:PrintGCDetails 更具体的请参考: http://flash520.blog.163.com/blog/static/34414475201063041157163/ 转载于:https://www.cnblogs.com/bestchenwu/archive/2011/11/26/9655409.html

eclipse c语言_如果你的电脑是windows7/10的环境,用什么编译器学习C语言好?

既然问题已经限制了Windows环境&#xff0c;那么就不再推荐Linux环境下的编译器了&#xff0c;虽然在Linux环境进行C语言的编程会比Windows可以更好的掌握一些基础知识&#xff0c;自己动手gcc,写makefile文件了解编译&#xff0c;链接的过程。下面对windows环境C语言开发IDE进…

Apache Tomcat 7.0.93 发布,开源 Java Web 应用服务器

Apache Tomcat 7.0.93 已发布&#xff0c;Tomcat 是 Java Servlet、JavaServer Pages、Java 表达式语言和 Java WebSocket 技术的开源实现&#xff0c;是一个免费的开放源代码的 Web 应用服务器。 与 7.0.92 相比&#xff0c;该版本包含许多 bug 修复和改进。有以下值得关注的变…

C# using 语法说明

using 关键字有两个主要用途&#xff1a; (一).作为指令&#xff0c;用于为命名空间创建别名或导入其他命名空间中定义的类型。 (二).作为语句&#xff0c;用于定义一个范围&#xff0c;在此范围的末尾将释放对象。using指令 ①允许在命名空间中使用类型&#xff0c;这样&…

多行表头_多行表头数据汇总你怎么操作?手动复制粘贴?OUT!用VBA1分钟完成

前景提要(文末提供源码下载)发现小伙伴们的数据结果真的好复杂&#xff0c;不昨天才分享过有多行表头的数据如何汇总合并&#xff0c;今天就有小伙伴反馈&#xff0c;他的数据虽然是有多行表头的&#xff0c;但是又有一些数据没有多行表头&#xff0c;那么在进行批量数据汇总的…

VirtualBox上Ubuntu 共享文件夹

1. virtualbox 菜单栏中设备--》共享文件夹&#xff0c;添加一个共享文件夹&#xff0c;比如共享文件夹路径是D:/share&#xff0c;共享文件夹名称是share。 2. 进入虚拟Ubuntu&#xff0c;在命令行终端输入&#xff1a; sudo mkdir /mnt/sharesudo mount -t vboxsf share /mnt…

tinyMCE

TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器&#xff0c;由JavaScript写成。它对IE6和Firefox1.5都有着非常良好的支持。 功能方面虽然不能称得上是最强&#xff0c;但绝对能够满足大部分网站的需求&#xff0c;并且功能配置灵活简单。另一特点是加载速度非常快&#x…

监管大屏系统_高速公路监管系统大屏可视化

0x00 项目背景该项目用于高速公路监管。高速公路监管包括&#xff1a;高速公路的设备运行情况&#xff0c;设备维护情况&#xff0c;道路维护情况&#xff1b;交通流量分析&#xff0c;交通拥堵分析&#xff0c;拥堵溯源&#xff1b;事故分析&#xff0c;事件信息发布等。0x01设…

Android(java)学习笔记96:layout_weight使用注意事项

1. android:layout_weight使用说明&#xff1a; layout_weight是权重的意思&#xff0c;也就是各个控件所占的比重&#xff0c;用在LinearLayout布局中。当我们使用layout_weight的时候&#xff0c;layout_width和layout_height有三种表示方法 2. android:layout_weight使用之 …

41.uniq命令

uniq命令&#xff1a; 选项&#xff1a;-c:显示每行的重复次数&#xff1b;-u:仅显示未曾重复过的行&#xff1b;-d:仅显示重复过的行&#xff1b; 实例&#xff1a; 转载于:https://blog.51cto.com/itxuezhe/2354162

[JS-JQuery]基础

<noscript> If you see this message, your web browser doesnt support JavaScript or JavaScript is disabled. Please enable JavaScript in your browser settings so Newegg.com can function correctly.</noscript> $(tr:odd) //选择表格的奇数行$(div:visi…

位置偏移问题 绘制_AutoCAD教程之绘制螺栓连接组合图

螺栓、螺母是机械连接件中最为常用的标准件&#xff0c;螺栓连接通常需要组合在一起。下面我们以绘制螺栓连接组合件为例&#xff0c;学习在AutoCAD 2019中移动、复制、旋转等操作的应用方法。1. 新建文件及图层新建一个“无样板公制”文件&#xff0c;新建粗实线、细实线、中心…

spring mvc 控制器方法传递一些经验对象的数组

由于该项目必须提交一个表单&#xff0c;其中多个对象,更好的方法是直接通过在控制器方法参数的数组。 因为Spring mvc框架在反射生成控制方法的參数对象的时候会调用这个类的getDeclaredConstructor方法来获得构造函数, 可是一直报NoSuchMethodException的异常。 依据这种方法…