抛出问题:

  假定字符串 s1 = 'BDCABA', s2 = 'ABCBDAB',求s1和s2的最大公共子序列。

问题分析:

  我们想要求出s1和s2的最大公共子序列,我们可以用c(i,j)表示s1(i)和s2(j)最大公共子序列的长度,

   假定c(i,j) = m,

     如果:s1[ i ]s2[ j ]相等,那么推出c(i,j) = c(i-1,j-1)  + 1,

  如果:s1[ i ] 和 s2[ j ]不相等,那么得到c(i,j) = max(c(i,j-1),c(i-1,j))

  总结为公式就是:

画成表格更清楚,也就是如下图,表格的数即为当前的最大公共子序列的值,箭头即为该结果是怎么得来的

例如第5行,第5列,因为第5列的c和第5行c相等,所以就等于,第4行,第4列的值+1等到2

  得到了这个值列表,就可以通过回溯的方法,从最后一个值,倒着按照箭头的方向,依次记录每个相等的值(也就是方向是左上的值),得到的结果就是我们要求的最终结果

代码实现:

# -*- coding:utf-8  -*-
# 日期:2018/6/9 15:44
# Author:小鼠标
# 求最长公共子序列
from numpy import *
s1 = 'BDCABA'
s2 = 'ABCBDAB' def val_list(s1,s2):
# 两个字符串的长度
len_s1 = len(s1) + 1
len_s2 = len(s2) + 1
# 方向列表
direction_list = []
# 生成len_s2+1行len_s1+1列的全0列表
res = zeros((len_s2,len_s1))
direction = zeros((len_s2,len_s1))
# print(res_list)
for i in range(0, len_s2-1):
for j in range(0, len_s1-1):
#判断是否相等
if s1[j] == s2[i]:
res[i + 1, j + 1] = res[i, j] + 1
# 1左上 2 上 3左
direction[i + 1, j + 1] = 1
else:
if res[i + 1, j] > res[i, j + 1]:
res[i + 1, j + 1] = res[i + 1, j]
direction[i + 1, j + 1] = 3
else:
res[i + 1, j + 1] = res[i, j + 1]
direction[i + 1, j + 1] = 2
return res,direction
res ,direction= val_list(s1,s2)
#方向列表 1左上 2 上 3左
# [[0. 0. 0. 0. 0. 0. 0.]
# [0. 2. 2. 2. 1. 3. 1.]
# [0. 1. 3. 3. 2. 1. 3.]
# [0. 2. 2. 1. 3. 2. 2.]
# [0. 1. 2. 2. 2. 1. 3.]
# [0. 2. 1. 2. 2. 2. 2.]
# [0. 2. 2. 2. 1. 2. 1.]
# [0. 1. 2. 2. 2. 1. 2.]] #最大子序列的值列表
# [[0. 0. 0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 1. 1. 1.]
# [0. 1. 1. 1. 1. 2. 2.]
# [0. 1. 1. 2. 2. 2. 2.]
# [0. 1. 1. 2. 2. 3. 3.]
# [0. 1. 2. 2. 2. 3. 3.]
# [0. 1. 2. 2. 3. 3. 4.]
# [0. 1. 2. 2. 3. 4. 4.]] #回溯 递归求出结果
global s_res
s_res = ''
def Lcs_fun(s,res_list,i,j):
if res_list[i,j] == 3:
Lcs_fun(s,res_list,i,j-1) elif res_list[i,j] == 2:
Lcs_fun(s,res_list,i-1,j) elif res_list[i,j] == 1:
Lcs_fun(s,res_list,i-1,j-1)
global s_res
s_res += s[i-1]
else:
return
Lcs_fun(s2,direction,len(s2),len(s1))
print(s_res)

这块很容易就看晕了,仔细看,应该能看懂

python3 lcs 最大公共子序列的更多相关文章

  1. LCS最大公共子序列问题

    在生物应用中,经常需要比较两个(或多个)不同生物体的DNA, 例如:某种生物的DNA可能为S1=ACCGGTCGAGTGCGCGGAAGCCGGCCGAA, 另一种生物的DNA可能为S2=GTCGTT ...

  2. LCS最大公共子序列【转载】

    在两个字符串中,有些字符会一样,可以形成的子序列也有可能相等,因此,长度最长的相等子序列便是两者间的最长公共字序列,其长度可以使用动态规划来求. 以s1={1,3,4,5,6,7,7,8},s2={3 ...

  3. 动态规划之LCS(最大公共子序列)

    #include <stdio.h> #include <string.h> int b[50][50]; int c[50][50]; int length = 0; voi ...

  4. Poj1159 Palindrome(动态规划DP求最大公共子序列LCS)

    一.Description A palindrome is a symmetrical string, that is, a string read identically from left to ...

  5. Advanced Fruits (最大公共子序列的路径打印)

    The company "21st Century Fruits" has specialized in creating new sorts of fruits by trans ...

  6. hdu 1243 反恐训练营(dp 最大公共子序列变形)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1243 d[i][j] 代表第i 个字符与第 j 个字符的最大的得分.,, 最大公共子序列变形 #inclu ...

  7. spoj Longest Common Substring (多串求最大公共子序列)

    题目链接: https://vjudge.net/problem/SPOJ-LCS 题意: 最多10行字符串 求最大公共子序列 数据范围: $1\leq |S| \leq100000$ 分析: 让他们 ...

  8. 最大公共子序列(Runtime faster than 92.73% of Python3)

    其中的算法思想只是较为简单的动态规划,过去各种各样的考试写过很多次C/C++版本的,最近开始用Python做leetcode中的题目时遇到了该题目,很常规的做法竟然得到了意想不到的速度,但内存占用较差 ...

  9. POJ - 2250 Compromise (LCS打印序列)

    题意:给你两个单词序列,求出他们的最长公共子序列. 多组数据输入,单词序列长度<=100,单词长度<=30 因为所有组成LCS的单词都是通过 a[i] == b[j] 更新的. 打印序列的 ...

随机推荐

  1. MTLD -词汇复杂度的指标

    论文: MTLD, vocd-D, and HD-D: A validation study of sophisticated approaches to lexical diversity asse ...

  2. vue 图片加载失败调用

    <img :src="bak" @error="imgLoadError()" alt="bak"> data(){ retur ...

  3. Oracle数据库 基础SQL语句练习

    一.说明 第一次使用Oracle,想做一些练习,熟悉一些oracle. 表:使用的是scott用户,默认的表 具体表讲解,可以参考该文档:https://www.cnblogs.com/xjcheng ...

  4. Go学习之初出茅庐

    在一个月黑风高的夜晚,机缘巧合与Go语言一面之缘,被她的简洁.灵活.高效所吸引,让我有深入学习的冲动,现在开始我的成长之路吧.

  5. 关于Object.keys()和for in的区别

    今天见到一道面试题让说一说Object.keys()和for in的区别,顿时有些发懵“What's Object.keys?”我立马上网搜了一下,大致作用也是做遍历,参数是一个对象,返回值是一个数组 ...

  6. eclipse运行无错的ssm项目,迁移到idea出错

    我的报错信息为mapper绑定相关错误,是因为idea在构建项目时,target/classes目录下不存在mapper.xml文件 解决方法: <!-- 在maven中添加以下配置,它的父标签 ...

  7. 【frame系列标签】

    html框架标签1.内嵌框架 <frame></frame> 在页面上开辟一块空间 frame内部属性: src 要填充的图片或者网址 width height target= ...

  8. CSS 关于权重的另类解说

    众所周知,对于CSS中权重的顺序,从大到小依次如下: !important id class 标签 在html标签中写入行内样式style,又大于link引入.相同类型的样式标记,在数量上多的大于数量 ...

  9. 西门子S7-300 PLC视频教程(百度网盘)

    西门子S7-300 PLC视频教程(百度网盘) 百度网盘链接地址: 链接:https://pan.baidu.com/s/1MqC0DJbv-ndCzk9XGU2AYQ 提取码:u5eq 祝大家天天开 ...

  10. 【MatConvNet代码解析】 vl_nnsoftmaxloss

    背景知识:http://deeplearning.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92 假设softmax层的输入(softmax ...