最长公共子序列 - LCS

  • 问题描述
    • 子序列定义
    • 子串定义
    • 公共子序列定义
    • 最长公共子序列(以下简称LCS)
  • 动态规划解决
    • 子问题划分及依赖关系
    • 递推公式
  • 伪代码
  • 代码实现
  • 复杂度分析

问题描述

子序列定义

给定一个序列X=<x1,x2,x3,x4…,xm>,另一个序列Z=<z1,z2,z3,z4…,zk>,若存在一个严格递增的X的下标序列<i1,i2,i3,…,ik>对所有的1,2,3,…,k,都满足x(ik)=zk,则称Z是X的子序列

比如Z=<B,C,D,B>是X=<A,B,C,B,D,A,B>的子序列

子串定义

子串的话与子序列不同,子串要求必须连续。

例如
BCDB 虽然是X=<A,B,C,B,D,A,B>的子序列
但不是它的字串 因为BCDB不连续。
BCBD属于<A,B,C,B,D,A,B>的字串

该篇文章我们要求的是 子序列 而不是 子串

公共子序列定义

如果Z既是X的子序列,又是Y的子序列,则称Z为X和Y的公共子序列

最长公共子序列(以下简称LCS)

2个序列的公共子序列中长度最长的那个

动态规划解决

子问题划分及依赖关系

递推公式

伪代码


利用标记函数追踪解:

代码实现

public class LCS {public static void main(String[] args) {String x = "ABCBDAB";String y = "BDCABA";int m = x.length();int n = y.length();// 动态数组int[][] c = new int[m+1][n+1];// 标记函数数组int[][] b = new int[m+1][n+1];// 上边界赋值为0for (int i=0; i<=n; i++) {c[0][i] = 0;b[0][i] = 0;}// 左边界赋值为0for (int i=0; i<=m; i++) {c[i][0] = 0;b[i][0] = 0;}System.out.println("字符串1:" + x);System.out.println("字符串2:" + y);LCSlength(m, n, x, y, c, b);System.out.println("x,y 的最长公共子序列长度为:" +  c[m][n]);// 倒序输出 公共子序列System.out.println("倒序输出 公共子序列:");LCS(m, n, b, x);}/*** 最长公共子序列*/public static void LCSlength(int m, int n, String x, String y, int[][] c, int[][] b) {for (int i=1; i<=m; i++) {for (int j=1; j<=n; j++) {if (x.charAt(i-1) == y.charAt(j-1)) {   // 若字符相同 c[i][j] = c[i-1][j-1] + 1;c[i][j] = c[i-1][j-1] + 1;b[i][j] = 1;    // 1 代表 ↖} else if (c[i][j-1] > c[i-1][j]) { // 字符不同取最大 c[i][j] = max(c[i][j-1], c[i-1][j])c[i][j] = c[i][j-1];b[i][j] = 2;    // 2 代表 ←} else {c[i][j] = c[i-1][j];b[i][j] = 3;    // 3 代表 ↑}}}// 输出所填表System.out.println("输出所填动归表:");for (int i=0; i<=m; i++) {for (int j=0; j<=n; j++) {System.out.print(c[i][j] + " ");}System.out.println();}}/*** 输出 最长公共子序列 倒序输出* @param i* @param j* @param b:标记函数数组* @param x:x字符串*/public static void LCS(int i, int j, int[][] b, String x) {if (i==0 || j==0) {return;}//  1 表示 ↖if (b[i][j] == 1) {System.out.print(x.charAt(i-1) + " ");// 输出该字符LCS(i-1, j-1, b, x);} else if (b[i][j] == 2) {  // 2 表示 ←LCS(i, j-1, b, x);} else {                    // 3 表示 ↑LCS(i-1, j, b, x);}}
}

输出结果:

复杂度分析


时间复杂度: O(mn) 两层循环
空间复杂度: O(mn) 需要一个二维数组的表格

最长公共子序列 - LCS相关推荐

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

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

  2. 动态规划之最长公共子序列(LCS)

    最长公共子序列(LCS,Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最 ...

  3. 程序员编程艺术第十一章:最长公共子序列(LCS)问题

    程序员编程艺术第十一章:最长公共子序列(LCS)问题 0.前言 程序员编程艺术系列重新开始创作了(前十章,请参考程序员编程艺术第一~十章集锦与总结).回顾之前的前十章,有些代码是值得商榷的,因当时的代 ...

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

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

  5. 最长公共子序列php,动态规划(最长公共子序列LCS)

    概念 求解决策过程最优化的结果 (可能有多个) 把多阶段过程转化为一系列单阶段过程,利用各阶段之间的关系,逐个求解 计算过程中会把结果都记录下,最终结果在记录中找到. 举例 求两个字符串的最长公共子序 ...

  6. python实现求解最长公共子序列LCS问题

    在实现论文<Automatically Generating Models for Botnet Detection>论文的算法中,用到了一个The longest commom subs ...

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

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

  8. 动态规划表格法解决最长公共子序列(LCS)问题

    3.5 最长公共子序列(LCS) 前言:图片是博主自己画的,转载请注明出处哦 3.5.1 问题描述 最长公共子序列(Longest Common Subseuence,LCS)问题:给定两个字符串,求 ...

  9. 最长公共子序列 (LCS) 详解+例题模板(全)

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/-萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗- ------------ ...

  10. 相似度:最长公共子序列--LCS

    一.概念 1.子序列 一个特定序列的子序列就是将给定序列中零个或多个元素去掉后得到的结果(不改变元素间相对次序).如序列[A,B,C,B,D,A,B]的子序列有:[A,B],[B,C,A],[A,D, ...

最新文章

  1. 如何识别出轮廓准确的长和宽
  2. 某天没有数据能查出来0数量_用Excel对纽约市出租车费数据探索性分析
  3. 给Ubuntu 开启 root 帐号并可 SSH 登录
  4. 020.2.2 runtime类
  5. 机器学习常见算法汇总
  6. CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)
  7. understand软件使用教程
  8. 索引( index )
  9. 在一个类型的继承体系中,成员的构造顺序
  10. 数据新动能:帆软第四届智数大会圆满落幕
  11. 网上邻居不能正常访问的处理
  12. 截止失真放大电路_模电必学基本放大电路
  13. java根据日期获得周月
  14. 机器学习系列(五) -- 逻辑回归(莺尾花数据集)
  15. Phalloidin——Acti-stain555鬼笔环肽研究
  16. 4年小Java的心路历程,工作感悟
  17. Android获取当前应用FPS(帧数)
  18. 计算机网络基础试卷分析,《计算机应用基础》期末试卷分析.doc
  19. 面试蚂蚁金服(意外拿到offer)分享四面经历,从线程锁到数据库
  20. 计算机音乐最早出现,电脑一直无缘无故出现音乐是为什么?

热门文章

  1. 企业邮箱客户端如何设置Foxmail
  2. 计算机毕业设计JAVA奶茶店管理系统mybatis+源码+调试部署+系统+数据库+lw
  3. C#与安捷伦34970a巡检仪通讯
  4. 如何将照片变漫画效果?分享两个照片变漫画小技巧
  5. [学习笔记]生成函数
  6. 路径是否存在 如果不存在则创建此路径
  7. python解决约瑟夫环(杀人游戏)
  8. 【软件设计师14】UML建模
  9. 精美摘抄,献给每一位有理想的大学生!
  10. JetBrains开发工具搭建远程开发环境