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] 更新的. 打印序列的 ...
随机推荐
- Vue 交互
- 20155219付颖卓《网络对抗》Exp6 信息搜集与漏洞扫描
基础问题回答 1.哪些组织负责DNS,IP的管理? 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和IP地址管理. 全球根域名服务器:绝大多数在欧洲和北美(全球13台 ...
- 2.4 逻辑运算符 &&(与)、||(或)、非(!)
一.逻辑运算符 &&(与).||(或).非(!) 逻辑运算符两边的表达式一定是布尔值,结果也是布尔值. 1.1.1 逻辑与 && => 表示并且.且的意思: tr ...
- laravel-阿里大于
安装扩展 # 安装curl模块apt-get install curl # 安装php5-curl扩展apt-get install php5-curl # 安装laravel阿里大鱼服务compos ...
- 学习笔记TF066:TensorFlow移动端应用,iOS、Android系统实践
TensorFlow对Android.iOS.树莓派都提供移动端支持. 移动端应用原理.移动端.嵌入式设备应用深度学习方式,一模型运行在云端服务器,向服务器发送请求,接收服务器响应:二在本地运行模型, ...
- https://www.cnblogs.com/yudanqu/p/9467803.html
https://www.cnblogs.com/yudanqu/p/9467803.html
- 【linux日常】 ACL权限管理
ACL ((Access Control Lists) setfacl命令 这里引用一个非常详细的命令介绍. 要点: getfacl -R 递归获取acl权限,可以存储为文件以备还原 g ...
- WiFi万能钥匙 for Macv1.1.0中文版
wifi万能钥匙 for Mac是一款运行在Mac平台上的免费WiFi热点软件,Mac分享无线流量.管理WiFi连接的必备神器.WiFi万能钥匙Mac版内置千万Wi-Fi热点数据,随时随地轻松接入无线 ...
- C++ 凸包生成算法
由于我的极差记忆力,我打算把这个破玩意先记下来.因为以后会有改动(Delaunay三角网生成算法),我不想把一个好的东西改坏了... 好吧-- 凸包生成算法,: 1.先在指定的宽(width)高(he ...
- Windows文本文件上传至linux显示乱码解决方法
iconv -f gbk -t UTF-8 显示异常文本名 -o 另存为文件名 iconv -f gbk -t UTF-8 rkgxdt_new.log -o new