最长公共子串和子序列的Python实现,带图示。
使用矩阵来记录两个子串之间各个字符之间的对应关系。
最长子串:矩阵中数字最大的就是最长子串的长度。若对应位置字符相同,则c[i][j] = c[i-1][j-1] + 1

def longSubStr(str1,str2):
len1 = len(str1)
len2 = len(str2)
longest,start1,start2 = 0,0,0
c = [[0 for i in range(len2+1)]for i in range(len1+1)]
for i in range(len1+1):
for j in range(len2+1):
if i == 0 or j == 0:
c[i][j] = 0
elif str1[i-1] == str2[j-1]:
c[i][j] = c[i-1][j-1]+1
else:
c[i][j] = 0
if (longest < c[i][j]):
longest = c[i][j]
start1 = i-longest
start2 = j-longest return str1[start1:start1+longest],start1,start2
最长子序列:若对应位置字符相同,则c[i][j] = c[i-1][j-1] + 1,若不同,则max(c[i][j-1],c[i-1][j]).


def printLcs(flag,a,i,j):
if i==0 or j==0:
return
if flag[i][j]=='OK':
printLcs(flag,a,i-1,j-1)
print a[i-1],
elif flag[i][j]=='Left':
printLcs(flag,a,i,j-1)
else:
printLcs(flag,a,i-1,j) def longSubSeq(str1,str2):
len1 = len(str1)
len2 = len(str2)
longest = 0
c = [[0 for i in range(len2+1)]for i in range(len1+1)]
flag = [[0 for i in range(len2+1)]for i in range(len1+1)]
for i in range(len1+1):
for j in range(len2+1):
if i == 0 or j == 0:
c[i][j] = 0
elif str1[i-1] == str2[j-1]:
c[i][j] = c[i-1][j-1]+1
flag[i][j] = 'OK'
longest = max(longest,c[i][j])
elif c[i][j-1] > c[i-1][j]:
c[i][j] =c[i][j-1]
flag[i][j] = 'Left'
else:
c[i][j] =c[i-1][j]
flag[i][j] = 'UP'
printLcs(flag,str1,len1,len2)
return longest
a='ABCBDAB'
b='BDCABA'
print longSubSeq(a,b)
最长公共子串和子序列的Python实现,带图示。的更多相关文章
- 用Python计算最长公共子序列和最长公共子串
如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...
- 【ZH奶酪】如何用Python计算最长公共子序列和最长公共子串
1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...
- 动态规划1——最长递增子序列、最长公共子序列、最长公共子串(python实现)
目录 1. 最长递增序列 2. 最长公共子序列 3. 最长公共子串 1. 最长递增序列 给定一个序列,找出其中最长的,严格递增的子序列的长度(不要求连续). 解法一:动态规划 通过一个辅助数组记录每一 ...
- [Python]最长公共子序列 VS 最长公共子串[动态规划]
前言 由于原微软开源的基于古老的perl语言的Rouge依赖环境实在难以搭建,遂跟着Rouge论文的描述自行实现. Rouge存在N.L.S.W.SU等几大子评估指标.在复现Rouge-L的函数时,便 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- 最长公共子序列PK最长公共子串
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...
- 动态规划(一)——最长公共子序列和最长公共子串
注: 最长公共子序列采用动态规划解决,由于子问题重叠,故采用数组缓存结果,保存最佳取值方向.输出结果时,则自顶向下建立二叉树,自底向上输出,则这过程中没有分叉路,结果唯一. 最长公共子串采用参考串方式 ...
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...
- DP:LCS(最长公共子串、最长公共子序列)
1. 两者区别 约定:在本文中用 LCStr 表示最长公共子串(Longest Common Substring),LCSeq 表示最长公共子序列(Longest Common Subsequence ...
随机推荐
- 升级python2.7, 实现python2.7与python3并存
由于用到twilio模块, 所以需要升级一下python2, 但是又不想舍弃python2, 于是实现了简单的方法 python 先扔一块依赖 yum install zlib-devel bzip2 ...
- C# 无法将类型为“__DynamicallyInvokableAttribute”的对象强制转换为类型...
错误代码: //遍历方法特性 foreach (MethodInfo m in type.GetMethods()) { foreach(Attribute a in m.GetCustomAttri ...
- MATLAB 均方根误差MSE、两图像的信噪比SNR、峰值信噪比PSNR、结构相似性SSIM
今天的作业是求两幅图像的MSE.SNR.PSNR.SSIM.代码如下: clc; close all; X = imread('q1.tif');% 读取图像 Y=imread('q2.tif'); ...
- wordpress安装教程
最近安装了wordpress来搭建自己的网站,过程有些艰辛,以防以后转移服务器再次遇到这个难题,在此记下自己的这次安装过程以及一些问题,同时也供遇到相同问题的初次接触者做参考. 另外说明一下我用的操作 ...
- 【新特性】JDK1.7
一.switch中可以使用字串 String s = "test";switch (s) { case "test" : System.out.printl ...
- 【HNOI 2019】校园旅行
Problem Description 某学校的每个建筑都有一个独特的编号.一天你在校园里无聊,决定在校园内随意地漫步. 你已经在校园里呆过一段时间,对校园内每个建筑的编号非常熟悉,于是你情不自禁的把 ...
- Http 状态码:
消息 100 Continue 101 Switching Protocols 102 Processing 成功 200 OK 201 Created 202 Accepted 203 Non-Au ...
- Log4net详细说明
1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是介绍如何在Visual S ...
- scikit_learn lasso详解
Lasso 回归 l1 正则化 The Lasso 是估计稀疏系数的线性模型. 它在一些情况下是有用的,因为它倾向于使用具有较少参数值的情况,有效地减少给定解决方案所依赖变量的数量. 因此,Lasso ...
- 支付-stripe
国外三大支付paypal,braintree,stripe,有兴趣可以去了解一下他们的区别. 支付宝和paypal基本只需要发送charge信息请求交给后端做就ok了,那么stripe前端也只需要收集 ...