详解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 相关文章推荐
tensorflow实现softma识别MNIST
Mar 12 Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
python [:3] 实现提取数组中的数
Nov 27 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
Python函数参数定义及传递方式解析
Jun 10 Python
python3代码中实现加法重载的实例
Dec 03 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
python UIAutomator2使用超详细教程
Feb 19 Python
如何使用Python实现一个简易的ORM模型
May 12 Python
使用opencv-python如何打开USB或者笔记本前置摄像头
Jun 21 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
PHP json_encode中文乱码问题的解决办法
2013/09/09 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
php实现可运算的验证码
2015/11/10 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python多线程编程(三):threading.Thread类的重要函数和方法
2015/04/05 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
python代码区分大小写吗
2020/06/17 Python
python和JavaScript哪个容易上手
2020/06/23 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
毕业生多媒体设计求职信
2013/10/12 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
手术室护士个人总结
2015/02/13 职场文书
为什么阅读对所有年龄段的孩子都很重要?
2019/07/08 职场文书
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记
一文搞懂Java中的注解和反射
2022/06/21 Java/Android