最长公共子序列(LCS,Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。而最长公共子串(要求连续)和最长公共子序列是不同的。

设X(m)={x(1), x(2), x(3),....,x(m)} 和 Y(n)={y(1), y(2), y(3),....,y(n)}的最长公共子序列Z(k)={z(1), z(2),z(3),....,z(k)}

首先,将原问题分解为子问题,得出一个已知的结论:当m或n等于0时,k等于0,即公共子序列长度为0

当m和n都不等于0时,此时分为三种情况:

(1) x(m) == y(n) ,此时z(k) = x(m) = y(n),该元素属于当前最长公共子序列的最后一个元素。此时Z(k-1)={ X(m-1)与Y(n-1)的最长公共子序列 }

(2) x(m) != y(n) ,且z(k) != x(m),此时Z={ X(m-1)与Y(n)的最长公共子序列 }

(3) x(m) != y(n) ,且z(k) != y(n),此时Z={ X(m)与Y(n-1)的最长公共子序列 }

其中X(m-1)={x(1), x(2), x(3),....,x(m-1)} , Y(n-1)={y(1), y(2), y(3),....,y(n-1)},Z(k-1)={z(1), z(2),z(3),....,z(k-1)}

上面三个步骤,每个步骤都是根据当前序列的状态,将问题转化为已知解的子问题(最初的已知解的子问题是当m==0或n==0时),从而求出当前问题的解。

由此便得出了该问题的状态转移方程,数学描述如下:

现有两个序列X={x1,x2,x3,...xi},Y={y1,y2,y3,....,yi},

设一个C[i,j]: 保存Xi与Yj的LCS的长度

最后,该算法的python实现:

 1 # 最长公共子序列问题
 2 __author__ = 'ice'
 3
 4
 5 # arr_x,arr_y [0 ~ length-1]
 6 # subarr_len [0,1~x_length][0,1~y_length]
 7 # flag [0 ~ x_length-1][0 ~ y_length]
 8
 9
10 def lcs_length(arr_x, arr_y):
11     x_length = len(arr_x)
12     y_length = len(arr_y)
13     subarr_len = [[0 for j in range(y_length + 1)] for i in range(x_length + 1)]
14     flag = [[0 for j in range(y_length)] for i in range(x_length)]
15     for i in range(1, x_length + 1):
16         for j in range(1, y_length + 1):
17             if arr_x[i - 1] == arr_y[j - 1]:
18                 subarr_len[i][j] = subarr_len[i - 1][j - 1] + 1
19                 flag[i - 1][j - 1] = 1
20             elif subarr_len[i - 1][j] >= subarr_len[i][j - 1]:
21                 subarr_len[i][j] = subarr_len[i - 1][j]
22                 flag[i - 1][j - 1] = 2
23             else:
24                 subarr_len[i][j] = subarr_len[i][j - 1]
25                 flag[i - 1][j - 1] = 3
26     return {'subarr_length': subarr_len[x_length][y_length], 'flag': flag}
27
28
29 def lcs(arr_x, x_i, y_j, flag, result):
30     if x_i < 0 or y_j < 0:
31         return
32     if flag[x_i][y_j] == 1:
33         lcs(arr_x, x_i - 1, y_j - 1, flag, result)
34         result.append(arr_x[x_i])
35     elif flag[x_i][y_j] == 2:
36         lcs(arr_x, x_i - 1, y_j, flag, result)
37     elif flag[x_i][y_j] == 3:
38         lcs(arr_x, x_i, y_j - 1, flag, result)
39
40
41 array_x = ['a', 'b', 'c', 'b', 'd', 'a', 'b']
42 array_y = ['b', 'd', 'c', 'a', 'b', 'a']
43 longest_common_subsequence = []
44 lcs_info = lcs_length(array_x, array_y)
45 lcs(array_x, len(array_x) - 1, len(array_y) - 1, lcs_info['flag'], longest_common_subsequence)
46 print(longest_common_subsequence)

转载于:https://www.cnblogs.com/z941030/p/4910035.html

动态规划之最长公共子序列(LCS)相关推荐

  1. 动态规划解最长公共子序列(LCS)(附详细填表过程)

    目录 相关概念 子序列形式化定义: 公共子序列定义: 最长公共子序列(以下简称LCS): 方法 蛮力法求解最长公共子序列: 动态规划求解最长公共子序列: 分析规律: 做法: 伪代码: 下面演示下c数组 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 动态规划解决最长公共子序列

    动态规划解决最长公共子序列 问题描述 给定两个序列,例如 X = "ABCBDAB".Y = "BDCABA",求它们的最长公共子序列的长度. 递归关系 c[i ...

  9. [dp]leetcode1143:最长公共子序列LCS (medium)

    题目: 题解: 动态规划的经典例题,可参考晴神的算法笔记 首先先使用暴力法思考吧,设t1和t2的长度分别为m和n,那么对两个字符串中的每个字符,分别只有选和不选两个决策,而得到两个子序列后,比较两个子 ...

最新文章

  1. 人工智能的另一方向:基于忆阻器的存算一体技术
  2. Silverlight获取WebHost配置信息--WebClient和XmlSerializer模拟
  3. vim的介绍与常用的命令
  4. 今日头条上传图片时设置封面图报像素低的原因是什么
  5. Mysql 优化(学习笔记二十)
  6. stm32定时2通道3映射_stm32学习笔记之问题总结
  7. 征集公开课内容的建议
  8. python课程价格-南山区python课程价格
  9. 收集的图像处理网站http://blog.csdn.net/chief1985/article/details/1898358
  10. 【情感分析】情感分析研究的新视野
  11. 新物联网时代的整合战略
  12. LeetCode8 字符串转整数
  13. 利用SPA(SQL Performance Analyzer)对比两个SQL Tuning Set
  14. 基于JavaEE的公共自行车租赁管理系统_JSP网站设计_SqlServer数据库设计
  15. 解决:卸载anaconda后 cmd闪退或打不开
  16. [汇编语言例题]计算地址连续的ffff:0~ffff:b单元中的数据的和(详解)
  17. 关于工信部191号文《App违法违规收集使用个人信息行为认定方法》的评估
  18. 【老九】【Python】文件操作与异常处理
  19. Oracle开发 之 主-外键约束FK及约束的修改
  20. Vlad and Unfinished Business (图论)

热门文章

  1. Nginx综合介绍以及配置文件详解
  2. KVO-基本使用方法-底层原理探究-自定义KVO-对容器类的监听
  3. 携程基于Flink的实时特征平台
  4. Tomcat 6 --- JNDI详解
  5. [LintCode] Simplify Path [字符串操作]
  6. 田溯宁:云基地就像一个苗圃
  7. URL中允许携带sessionid带来的安全隐患。
  8. 史上最有趣的Readme
  9. 《也要相信》——沙叶新
  10. flink社区提问没有人回答是怎么回事?