详解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实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
深入理解python函数递归和生成器
Jun 06 Python
利用Python实现Windows定时关机功能
Mar 21 Python
Python如何实现MySQL实例初始化详解
Nov 06 Python
Python使用pandas对数据进行差分运算的方法
Dec 22 Python
Django框架视图介绍与使用详解
Jul 18 Python
基于Python中的yield表达式介绍
Nov 19 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
tensorflow多维张量计算实例
Feb 11 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
Pythonic版二分查找实现过程原理解析
Aug 11 Python
Python如何用re模块实现简易tokenizer
May 02 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
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
filemanage功能中用到的lib.js
2007/04/08 Javascript
javascript 写类方式之二
2009/07/05 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
微信小程序实现美团菜单
2018/06/06 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
python线程锁(thread)学习示例
2013/12/04 Python
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
Python中处理时间的几种方法小结
2015/04/09 Python
深入解答关于Python的11道基本面试题
2017/04/01 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
python程序变成软件的实操方法
2019/06/24 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
对python中各个response的使用说明
2020/03/28 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
老师对学生的评语
2014/04/18 职场文书
小摄影师教学反思
2014/04/27 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
护士实习自荐信
2015/03/06 职场文书
网络销售员岗位职责
2015/04/11 职场文书