详解Python最长公共子串和最长公共子序列的实现


Posted in Python onJuly 07, 2018

最长公共子串(The Longest Common Substring)

LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置。

def find_lcsubstr(s1, s2): 
 m=[[0 for i in range(len(s2)+1)] for j in range(len(s1)+1)] #生成0矩阵,为方便后续计算,比字符串长度多了一列
 mmax=0  #最长匹配的长度
 p=0 #最长匹配对应在s1中的最后一位
 for i in range(len(s1)):
 for j in range(len(s2)):
  if s1[i]==s2[j]:
  m[i+1][j+1]=m[i][j]+1
  if m[i+1][j+1]>mmax:
   mmax=m[i+1][j+1]
   p=i+1
 return s1[p-mmax:p],mmax  #返回最长子串及其长度
 
print find_lcsubstr('abcdfg','abdfg')

运行得到输出:('dfg',3)

最长公共子序列 (The Longest Common Subsequence)

子串要求字符必须是连续的,但是子序列就不是这样。最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。
        解法就是用动态回归的思想,一个矩阵记录两个字符串中匹配情况,若是匹配则为左上方的值加1,否则为左方和上方的最大值。一个矩阵记录转移方向,然后根据转移方向,回溯找到最长子序列。

import numpy
def find_lcseque(s1, s2): 
 # 生成字符串长度加1的0矩阵,m用来保存对应位置匹配的结果
 m = [ [ 0 for x in range(len(s2)+1) ] for y in range(len(s1)+1) ] 
 # d用来记录转移方向
 d = [ [ None for x in range(len(s2)+1) ] for y in range(len(s1)+1) ] 
 
 for p1 in range(len(s1)): 
 for p2 in range(len(s2)): 
  if s1[p1] == s2[p2]:      #字符匹配成功,则该位置的值为左上方的值加1
  m[p1+1][p2+1] = m[p1][p2]+1
  d[p1+1][p2+1] = 'ok'     
  elif m[p1+1][p2] > m[p1][p2+1]: #左值大于上值,则该位置的值为左值,并标记回溯时的方向
  m[p1+1][p2+1] = m[p1+1][p2] 
  d[p1+1][p2+1] = 'left'     
  else:              #上值大于左值,则该位置的值为上值,并标记方向up
  m[p1+1][p2+1] = m[p1][p2+1]  
  d[p1+1][p2+1] = 'up'     
 (p1, p2) = (len(s1), len(s2)) 
 print numpy.array(d)
 s = [] 
 while m[p1][p2]:  #不为None时
 c = d[p1][p2]
 if c == 'ok':  #匹配成功,插入该字符,并向左上角找下一个
  s.append(s1[p1-1])
  p1-=1
  p2-=1 
 if c =='left': #根据标记,向左找下一个
  p2 -= 1
 if c == 'up':  #根据标记,向上找下一个
  p1 -= 1
 s.reverse() 
 return ''.join(s) 
print find_lcseque('abdfg','abcdfg')

得到输出结果:

详解Python最长公共子串和最长公共子序列的实现

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python解决鸡兔同笼问题的方法
Dec 20 Python
Python性能优化技巧
Mar 09 Python
使用Python实现下载网易云音乐的高清MV
Mar 16 Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 Python
Python应用库大全总结
May 30 Python
python批量识别图片指定区域文字内容
Apr 30 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 Python
详解Django配置优化方法
Nov 18 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 Python
python 将html转换为pdf的几种方法
Dec 29 Python
Python列表的索引与切片
Apr 07 Python
python求最大连续子数组的和
Jul 07 #Python
python 平衡二叉树实现代码示例
Jul 07 #Python
详解python异步编程之asyncio(百万并发)
Jul 07 #Python
基于Python开发chrome插件的方法分析
Jul 07 #Python
Python实现基于C/S架构的聊天室功能详解
Jul 07 #Python
Python实现的txt文件去重功能示例
Jul 07 #Python
Django 多语言教程的实现(i18n)
Jul 07 #Python
You might like
php 读取文件乱码问题
2010/02/20 PHP
php调用Google translate_tts api实现代码
2013/08/07 PHP
PHP中soap的用法实例
2014/10/24 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
js 函数调用模式小结
2011/12/26 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
2017/03/21 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
深入理解Python中的元类(metaclass)
2015/02/14 Python
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
如何在Python中编写并发程序
2016/02/27 Python
python自动裁剪图像代码分享
2017/11/25 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
2020/01/03 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
STAUD官方网站:洛杉矶独有的闲适风格
2019/04/11 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
建筑工程实习自我鉴定
2013/09/19 职场文书
酒店管理求职信范文
2014/04/06 职场文书
医德医风演讲稿
2014/05/20 职场文书
2015年检验员工作总结范文
2015/04/30 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
sql注入报错之注入原理实例解析
2022/06/10 MySQL