一、问题描述

最长公共子序列(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);

算法之最长公共子序列问题相关推荐

  1. LCS算法:最长公共子序列

    LCS算法:最长公共子序列定义: 一个序列A任意删除若干个字符得到新序列B,则A叫做B的子序列 两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列 例如: X={A,B,C,B ...

  2. 用动态规划算法实现最长公共子序列问题的算法(java实现)

    用动态规划算法实现最长公共子序列问题的算法 public class longestCommonSubsequence {//构造追踪数组rec,记录子问题来源private static Strin ...

  3. java lcs_Java算法之最长公共子序列问题(LCS)实例分析

    本文实例讲述了Java算法之最长公共子序列问题(LCS).分享给大家供大家参考,具体如下: 问题描述:一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X= { x1, x ...

  4. 动态规划算法解最长公共子序列LCS问题

    动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...

  5. 算法之最长公共子序列(LCS)问题

    算法课上老师留的作业,最长公共子序列LCS(Longest Common Subsequence)问题,首先看到这个问题感觉有点复杂,和最长公共子串不同,公共子序列并不要求元素相邻,看起来只有穷举才能 ...

  6. 算法导论-----最长公共子序列LCS(动态规划)

    目录 一.概念梳理 二.最长公共子序列解决方案 方案1:蛮力搜索策略 方案2:动态规划策略 三.C代码实现 实现1 实现2(空间优化) 一.概念梳理   1. 子序列(subsequence): 一个 ...

  7. 【算法】最长公共子序列(LCS)

    1. 概述 题目描述:给定两个字符串(或数字序列)A和B,求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以是补连续的) 例如:"sadstory" 和 "a ...

  8. 动态规划算法---求最长公共子序列

    最长公共子序列和最长公共子串区别        最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要 ...

  9. 算法学习 - 最长公共子序列(LCS)C++实现

    最长公共子序列 最长公共子序列的问题很简单,就是在两个字符串中找到最长的子序列,这里明确两个含义: 子串:表示连续的一串字符 . 子序列:表示不连续的一串字符. 所以这里要查找的是不连续的最长子序列, ...

  10. LCS算法(最长公共子序列问题)

    1.问题 注意:LCS问题即公共子序列问题,不要求所求得的字符在所给的字符串中是连续的(例如:输入两个字符串ABCD和BAC,字符串AC和BC都是它们的最长公共子序列,长度为2.输入两个字符串ABCB ...

最新文章

  1. Java List与ArrayList 的区别(List list =new Arraylist(); ArrayList<String> arrayList = new ArrayList())
  2. slave-pxc后GTID不一致
  3. bios get serialnumber 无法启动服务_联想笔记本BIOS升级教程
  4. 实战解析:真实AI场景下,极小目标检测与精度提升 | 百度AI公开课
  5. j2ee性能调优之最小化资源压力测试法则
  6. 网页制作中最有用的免费Ajax和JavaScript代码库
  7. 有什么值得推荐的Java Web练手项目?
  8. 8-1日复习 模板函数 模板类
  9. android 汉字转拼音pinyin4j包
  10. limux php启动_linux下nginx与php设置开机启动代码
  11. 怎么让模糊的数字变清楚_一键模糊图像变清晰,好家伙!这款神器插件你值得拥有...
  12. How to proof Pi
  13. 移动开发者的未来在哪里?
  14. JDY-10M串口调试、焊接问题总结
  15. poj3764解题报告
  16. 系统分析设计案例分析
  17. Android穿山甲SDK激励视频
  18. 蔷薇灵动或成为云安全领域“独角兽”?
  19. bootstraptable treegrid
  20. [四连测(三)]圆形谷仓

热门文章

  1. 想看的公众号文章被删了怎么办?
  2. 牵手科大讯飞,深算科技受邀参展1024开发者节
  3. daas 数据即服务_什么是云计算?云的基本特征;云服务模型;--IT基础知识系列...
  4. 电动汽车的结构及优势
  5. 电脑散热,电脑散热不好怎么办?如何解决电脑散热问题
  6. linux之sudo apt-get install **** 是到哪里下载软件以及下载到哪里去了
  7. oracle 杀掉spid,oracle 存储过程 sid spid 如果sid被杀掉了,spid是不也自动停止了?...
  8. Java POI导出Excel时,合并单元格没有边框的问题
  9. 联想计算机如何设置用户名和密码忘了,联想(Lenovo)路由器无线wifi密码忘记了怎么办啊?...
  10. 前缀表达式与后缀表达式