题目:

LCS for input Sequences “ABCDGH” and “AEDFHR” is “ADH” of length 3.
LCS for input Sequences “AGGTAB” and “GXTXAYB” is “GTAB” of length 4.

实现起来比较简单,状态方程:

LCS F[i,v] = (max{F[i-1,v],F[i,v-1]},F[i-1,v-1] +1)[X[i] == Y[v]]

代码实现:G为标记函数

 import numpy as np
def LCS(X,Y,N,V):
#    L = [[None]*(n+1) for i in xrange(m+1)] list = np.zeros((N+1,V+1),dtype = int)list[1:,1:] =-1G = np.full((N+1,V+1),'0')for i in range(1,N+1):for v in range(1,V+1):if X[i-1] == Y[v-1]:list[i][v] = list[i-1,v-1] +1G[i][v] = '7'else:if list[i-1,v] > list[i,v-1]:list[i][v] = list[i-1,v]G[i][v] = '^'else:list[i][v] =list[i,v-1]G[i][v] = '<'return list,G

主要介绍标记函数和追踪解,双针模型实现:

# 使用递归的方式
def print_LCS_Rec(X,Y,G,N,V):if N == 0 or V == 0:return elif G[N,V] == '7':print_LCS_Rec(X,Y,G,N-1,V-1) print X[N-1],elif G[N,V] == '^':print_LCS_Rec(X,Y,G,N,V-1)else :print_LCS_Rec(X,Y,G,N-1,V)return # 使用非递归方式
def print_LCS_(X,Y,G,N,V):i = Nv = Vresult = []while i > 0 and v > 0:if G[i,v] == '7':result += X[i-1]i -=1v -=1elif G[i,v] == '^':i -=1else:v -=1           return result[::-1]      # 直接使用DP表来追踪也可以实现
def print_LCS(X,Y,list,N,V):i = Nv = Vresult = []while i > 0 and v > 0:if X[i-1] == Y[v-1]:result += X[i-1]i -=1v -=1elif list[i-1,v] > list[i,v-1]:i -=1else:v -=1           return result[::-1]

运行结果

#%%
X = 'breather'
Y = 'conservatives'N = len(X)
V = len(Y)value,path = LCS(X,Y,N,V)
print value
print pathprint_LCS_Rec(X,Y,path,N,V)                print print_LCS(X,Y,value,N,V)
print print_LCS_(X,Y,path,N,V)[[0 0 0 0 0 0 0 0 0 0 0 0 0 0][0 0 0 0 0 0 0 0 0 0 0 0 0 0][0 0 0 0 0 0 1 1 1 1 1 1 1 1][0 0 0 0 0 1 1 1 1 1 1 1 2 2][0 0 0 0 0 1 1 1 2 2 2 2 2 2][0 0 0 0 0 1 1 1 2 3 3 3 3 3][0 0 0 0 0 1 1 1 2 3 3 3 3 3][0 0 0 0 0 1 1 1 2 3 3 3 4 4][0 0 0 0 0 1 2 2 2 3 3 3 4 4]]
[['0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0']['0' '<' '<' '<' '<' '<' '<' '<' '<' '<' '<' '<' '<' '<']['0' '<' '<' '<' '<' '<' '7' '<' '<' '<' '<' '<' '<' '<']['0' '<' '<' '<' '<' '7' '<' '<' '<' '<' '<' '<' '7' '<']['0' '<' '<' '<' '<' '^' '<' '<' '7' '<' '<' '<' '<' '<']['0' '<' '<' '<' '<' '^' '<' '<' '^' '7' '<' '<' '<' '<']['0' '<' '<' '<' '<' '^' '<' '<' '^' '^' '<' '<' '<' '<']['0' '<' '<' '<' '<' '7' '<' '<' '^' '^' '<' '<' '7' '<']['0' '<' '<' '<' '<' '^' '7' '<' '<' '^' '<' '<' '^' '<']]
e
a
t
e
['e', 'a', 't', 'e']
['e', 'a', 't', 'e']

最长公共子序列和追踪解相关推荐

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

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

  2. 最长公共子序列(LCS问题)

    先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC.这里解决的问题就是需要一种算法可以快速的计算出这 ...

  3. 详解动态规划最长公共子序列--JavaScript实现

    前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...

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

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

  5. vb treeview 展开子节点_详解最长公共子序列问题,秒杀三道动态规划题目

    学算法认准 labuladong 后台回复进群一起力扣? 读完本文,可以去力扣解决如下题目: 1143.最长公共子序列(Medium) 583. 两个字符串的删除操作(Medium) 712.两个字符 ...

  6. 最长公共子序列LCS(动态规划)—详解

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

  7. python求最长公共子串_Python-求解两个字符串的最长公共子序列

    一.问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB.则这两个字符串的最长公共子序列长 ...

  8. 算法设计-递归法解最长公共子序列问题 C代码

    给大家推荐一个公众号:诗葵1931 里面的诗歌很美 主要功能:递归法解最长公共子序列问题 #include<stdio.h> #include<string.h> /* 递归思 ...

  9. 最长公共子序列 - 北京大学郭炜 动态规划代码详解

    最长公共子序列 - 北京大学郭炜 动态规划代码详解 解题思路: 该题可用动态规划解决.动态规划需要我们找出子问题. 假设我们输入两个字符串: ACTTGACC CGTT 那么如何通过动态规划算出其最大 ...

最新文章

  1. zset中的score_每天五分钟,成就redis大神之Zset数据类型
  2. linux at自动挂化,linux的at定时任务的使用
  3. SDN第二章 win10远程桌面Ubuntu
  4. [C++11]共享智能指针shared_ptr指定删除器
  5. 普通话/汉语发音口型大全
  6. 带头结点头部插入创建链表
  7. I/O复用之 EPOLLONESHOT 事件
  8. map key char*
  9. 中国数学会副理事长田刚委员:建议从四个方面加强教师队伍建设
  10. Python排序算法(一)冒泡排序、选择排序、插入排序
  11. 链表 队列 基本概念 为什么使用二叉查找树 抽象数据类型
  12. Url几个常用的函数
  13. MySQL条件判断函数使用
  14. tomcat通过虚拟路径访问外部静态资源
  15. 使用命令运行jmeter并自动生成测试报告
  16. 高数竞赛、数学建模、算法、计算机专业书籍等亲情大甩卖
  17. python 性能问题_Python 性能问题一直饱受诟病,这篇我们讨论下提升 Python 应用性能的常见方法。...
  18. lightoj1234——调和级数+欧拉常数
  19. OpenLayers官方教程二:实现简单的地图显示
  20. NHibernate 联合查询,解决方法-通过自动转换成DataTable

热门文章

  1. 固件升级校准_RS网络分析仪自检自校准方法-Agitekservice
  2. 一个案例彻底弄懂如何正确使用 mysql inndb 联合索引
  3. oclick vue 传参 函数_详解Vue计算属性和侦听属性
  4. linux 分区_Linux文件系统、逻辑分区、物理分区
  5. SpringBoot的email发送ssl协议格式
  6. mysql经典总结文章_MySQL基础篇(01):经典实用查询案例,总结整理
  7. 【git】.gitignore文件
  8. JavaScript:向数组开头添加
  9. 【tomcat】catalina.home catalina.base 区别
  10. 计算机系统操作工培训视频,计算机系统操作工培训第三篇.ppt