python3 lcs 最大公共子序列
抛出问题:
假定字符串 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 最大公共子序列的更多相关文章
- LCS最大公共子序列问题
在生物应用中,经常需要比较两个(或多个)不同生物体的DNA, 例如:某种生物的DNA可能为S1=ACCGGTCGAGTGCGCGGAAGCCGGCCGAA, 另一种生物的DNA可能为S2=GTCGTT ...
- LCS最大公共子序列【转载】
在两个字符串中,有些字符会一样,可以形成的子序列也有可能相等,因此,长度最长的相等子序列便是两者间的最长公共字序列,其长度可以使用动态规划来求. 以s1={1,3,4,5,6,7,7,8},s2={3 ...
- 动态规划之LCS(最大公共子序列)
#include <stdio.h> #include <string.h> int b[50][50]; int c[50][50]; int length = 0; voi ...
- Poj1159 Palindrome(动态规划DP求最大公共子序列LCS)
一.Description A palindrome is a symmetrical string, that is, a string read identically from left to ...
- Advanced Fruits (最大公共子序列的路径打印)
The company "21st Century Fruits" has specialized in creating new sorts of fruits by trans ...
- hdu 1243 反恐训练营(dp 最大公共子序列变形)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1243 d[i][j] 代表第i 个字符与第 j 个字符的最大的得分.,, 最大公共子序列变形 #inclu ...
- spoj Longest Common Substring (多串求最大公共子序列)
题目链接: https://vjudge.net/problem/SPOJ-LCS 题意: 最多10行字符串 求最大公共子序列 数据范围: $1\leq |S| \leq100000$ 分析: 让他们 ...
- 最大公共子序列(Runtime faster than 92.73% of Python3)
其中的算法思想只是较为简单的动态规划,过去各种各样的考试写过很多次C/C++版本的,最近开始用Python做leetcode中的题目时遇到了该题目,很常规的做法竟然得到了意想不到的速度,但内存占用较差 ...
- POJ - 2250 Compromise (LCS打印序列)
题意:给你两个单词序列,求出他们的最长公共子序列. 多组数据输入,单词序列长度<=100,单词长度<=30 因为所有组成LCS的单词都是通过 a[i] == b[j] 更新的. 打印序列的 ...
随机推荐
- 2018.8.8 SpringMVC分层
分层: 表示层:请求分发,调用处理器,页面展示. 业务层:业务处理接口和实现. 持久层:数据访问和持久化. 各层之间解耦,下层对上层透明. 具体代码分析如下图,图转自https://blog.csdn ...
- hbase整合
hbase與hive整合 1. hive中有數據 --> 創建hive管理表映射hbase 例如: 1)hive創建內部表 create tabl ...
- 剖析servlet injection及源码分析.
@WebServlet("/cdiservlet") public class NewServlet extends HttpServlet { private Message m ...
- vue-----样式绑定 事件处理
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name=& ...
- springboot入门1
1引入springboot父依赖,和 spring-boot-starter-web的启动器 依赖引入后jar包展示依赖的情况 入门工程 配置数据源 package com.boot.web.con ...
- 谈lisp
The Lisp Curse /Lisp魔咒 http://winestockwebdesign.com/Essays/Lisp_Curse.html 英文出处 http://www.soimort. ...
- redis 设置分布式锁要避免死锁
1. jedis 中 setnx key value 虽然可以处理同步问题 (setnx 有返回值 1是key不存在把它设置进去,0是key已经存在了)但是 setnx设置完后 程序的下一步 有可能挂 ...
- java-log4j日志打印
参考路径: https://blog.csdn.net/edward0830ly/article/details/8250412 https://www.cnblogs.com/ITtangtang/ ...
- rocketmq 4.3.2 解决远程不能消费问题,解决未识别到公网IP问题
1.解决远程不能消费问题 问题描述: nameserver和broker启动后,用tools(命令如下)能发送消息和消费消息,在局域网服务器能发送消息,消费启动后收不到消息通知问题 sh tools. ...
- docker配置phpadmin需要注意的地方
因为web服务是在容器内跑的,ip地址注意,如果没有特殊配置,应该使用172.