详解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自然语言编码转换模块codecs介绍
Apr 08 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
python实现八大排序算法(2)
Sep 14 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
python 实时得到cpu和内存的使用情况方法
Jun 11 Python
3个用于数据科学的顶级Python库
Sep 29 Python
Python3安装Pillow与PIL的方法
Apr 03 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 Python
Pytorch Tensor基本数学运算详解
Dec 30 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
Pycharm常用快捷键总结及配置方法
Nov 14 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多个字符串替换成同一个的解决方法
2013/06/18 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
微信小程序实现实时圆形进度条的方法示例
2017/02/24 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
详解Python迭代和迭代器
2016/03/28 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
pandas 透视表中文字段排序方法
2018/11/16 Python
Python读写文件基础知识点
2019/06/10 Python
python如何实现视频转代码视频
2019/06/17 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
django orm模块中的 is_delete用法
2020/05/20 Python
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
运动会广播稿30字
2014/01/21 职场文书
个园导游词
2015/02/04 职场文书
上级领导检查欢迎词
2015/09/30 职场文书