详解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中执行shell命令的几个方法小结
Sep 18 Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 Python
python使用socket创建tcp服务器和客户端
Apr 12 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
Python代码太长换行的实现
Jul 05 Python
python实现代码统计器
Sep 19 Python
Python如何重新加载模块
Jul 29 Python
关于Kotlin中SAM转换的那些事
Sep 15 Python
Python SQLAlchemy库的使用方法
Oct 13 Python
python 基于selectors库实现文件上传与下载
Dec 31 Python
Python源码解析之List
May 21 Python
Python办公自动化解决world文件批量转换
Sep 15 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设计模式 Prototype (原型模式)代码
2011/06/26 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
jQuery stop()用法实例详解
2016/07/28 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
Node连接mysql数据库方法介绍
2017/02/07 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
介绍Python的@property装饰器的用法
2015/04/28 Python
python实现数组插入新元素的方法
2015/05/22 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
Python深入06——python的内存管理详解
2016/12/07 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
中海讯通笔试题
2015/09/15 面试题
大学生最新职业生涯规划书范文
2014/01/12 职场文书
企业内部培训方案
2014/02/04 职场文书
师德师风承诺书
2014/05/23 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android