算法之最长公共子序列问题
一、问题描述
最长公共子序列(longest common sequence)。什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。子序列每个元素的下标严格递增。
如上图,给定的字符序列: {a,b,c,d,e,f,g,h},它的子序列示例: {a,c,e,f} 即元素b,d,g,h被去掉后,保持原有的元素序列所得到的结果就是子序列。同理,{a,h},{c,d,e}等都是它的子序列。
最长公共子序列(以下都简称LCS)即给定序列s1={1,3,4,5,6,7,7,8},s2={3,5,7,4,8,6,7,8,2},s1和s2的相同子序列,且该子序列的长度最长,即是LCS。s1和s2的其中一个最长公共子序列是 {3,4,6,7,8}
二、问题分析
1.最优子结构:设有序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},它们的最长公共子序列是Z={z1,z2,…zk},则:
①若xm=yn,则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列;
②若xm!=yn,且zk!=xm,则Z是Xm-1和Y的最长公共子序列;
③若xm!=yn,且zk!=yn,则Z是X和Yn-1的最长公共子序列;
其中Xm-1={x1,x2,…,xm-1},Yn-1={y1,y2,…,yn-1},Zk-1={z1,z2,…zk-1};
2.子问题的递归结构:c[i][j]记录序列Xi和Yj的最长公共子序列的长度;
#include <iostream>
using namespace std;
#define M 8
#define N 7//序列x长度xl+1,序列y长度yl+1,
//c[i][j]记录子序列Xi和Yj的最长公共子序列长度,
//b[i][j]记录c[i][j]的值是由哪一个子问题得到的
void LCSLength(int xl,int yl,char x[],char y[],int c[M][N],int b[M][N])
{for(int i=0;i<xl;i++){c[i][0]=0;b[i][0]=0;} //多了一行和一排表示序列x和y都是空序列的情况for(int i=0;i<yl;i++){c[0][i]=0;b[0][i]=0;}for(int i=1;i<xl;i++){for(int j=1;j<yl;j++){if(x[i-1]==y[j-1]){c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}else {c[i][j]=c[i-1][j];int t = c[i][j-1];if(c[i][j]<t){c[i][j]=t;b[i][j]=2;}else b[i][j]=3;}}}
}void LCS(int i,int j,char x[],int b[M][N])
{if(i==0||j==0)return;if(b[i][j]==1){LCS(i-1,j-1,x,b);cout<<x[i-1]<<" ";}else if(b[i][j]==2)LCS(i,j-1,x,b);else LCS(i-1,j,x,b);
}int main()
{char x[]={'A','B','C','B','D','A','B'},y[]={'B','D','C','A','B','A'};int c[M][N],b[M][N];LCSLength(M,N,x,y,c,b);for(int i=0;i<M;i++){for(int j=0;j<N;j++)cout<<c[i][j]<<" ";cout<<endl;}LCS(M-1,N-1,x,b);
}
复杂性分析:O(n^2);
算法之最长公共子序列问题相关推荐
- LCS算法:最长公共子序列
LCS算法:最长公共子序列定义: 一个序列A任意删除若干个字符得到新序列B,则A叫做B的子序列 两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列 例如: X={A,B,C,B ...
- 用动态规划算法实现最长公共子序列问题的算法(java实现)
用动态规划算法实现最长公共子序列问题的算法 public class longestCommonSubsequence {//构造追踪数组rec,记录子问题来源private static Strin ...
- java lcs_Java算法之最长公共子序列问题(LCS)实例分析
本文实例讲述了Java算法之最长公共子序列问题(LCS).分享给大家供大家参考,具体如下: 问题描述:一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X= { x1, x ...
- 动态规划算法解最长公共子序列LCS问题
动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...
- 算法之最长公共子序列(LCS)问题
算法课上老师留的作业,最长公共子序列LCS(Longest Common Subsequence)问题,首先看到这个问题感觉有点复杂,和最长公共子串不同,公共子序列并不要求元素相邻,看起来只有穷举才能 ...
- 算法导论-----最长公共子序列LCS(动态规划)
目录 一.概念梳理 二.最长公共子序列解决方案 方案1:蛮力搜索策略 方案2:动态规划策略 三.C代码实现 实现1 实现2(空间优化) 一.概念梳理 1. 子序列(subsequence): 一个 ...
- 【算法】最长公共子序列(LCS)
1. 概述 题目描述:给定两个字符串(或数字序列)A和B,求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以是补连续的) 例如:"sadstory" 和 "a ...
- 动态规划算法---求最长公共子序列
最长公共子序列和最长公共子串区别 最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要 ...
- 算法学习 - 最长公共子序列(LCS)C++实现
最长公共子序列 最长公共子序列的问题很简单,就是在两个字符串中找到最长的子序列,这里明确两个含义: 子串:表示连续的一串字符 . 子序列:表示不连续的一串字符. 所以这里要查找的是不连续的最长子序列, ...
- LCS算法(最长公共子序列问题)
1.问题 注意:LCS问题即公共子序列问题,不要求所求得的字符在所给的字符串中是连续的(例如:输入两个字符串ABCD和BAC,字符串AC和BC都是它们的最长公共子序列,长度为2.输入两个字符串ABCB ...
最新文章
- Java List与ArrayList 的区别(List list =new Arraylist(); ArrayList<String> arrayList = new ArrayList())
- slave-pxc后GTID不一致
- bios get serialnumber 无法启动服务_联想笔记本BIOS升级教程
- 实战解析:真实AI场景下,极小目标检测与精度提升 | 百度AI公开课
- j2ee性能调优之最小化资源压力测试法则
- 网页制作中最有用的免费Ajax和JavaScript代码库
- 有什么值得推荐的Java Web练手项目?
- 8-1日复习 模板函数 模板类
- android 汉字转拼音pinyin4j包
- limux php启动_linux下nginx与php设置开机启动代码
- 怎么让模糊的数字变清楚_一键模糊图像变清晰,好家伙!这款神器插件你值得拥有...
- How to proof Pi
- 移动开发者的未来在哪里?
- JDY-10M串口调试、焊接问题总结
- poj3764解题报告
- 系统分析设计案例分析
- Android穿山甲SDK激励视频
- 蔷薇灵动或成为云安全领域“独角兽”?
- bootstraptable treegrid
- [四连测(三)]圆形谷仓
热门文章
- 想看的公众号文章被删了怎么办?
- 牵手科大讯飞,深算科技受邀参展1024开发者节
- daas 数据即服务_什么是云计算?云的基本特征;云服务模型;--IT基础知识系列...
- 电动汽车的结构及优势
- 电脑散热,电脑散热不好怎么办?如何解决电脑散热问题
- linux之sudo apt-get install **** 是到哪里下载软件以及下载到哪里去了
- oracle 杀掉spid,oracle 存储过程 sid spid 如果sid被杀掉了,spid是不也自动停止了?...
- Java POI导出Excel时,合并单元格没有边框的问题
- 联想计算机如何设置用户名和密码忘了,联想(Lenovo)路由器无线wifi密码忘记了怎么办啊?...
- 前缀表达式与后缀表达式