详解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 04 Python
python使用pymysql实现操作mysql
Sep 13 Python
python微信公众号之关注公众号自动回复
Oct 25 Python
Python中的类与类型示例详解
Jul 10 Python
python实现画出e指数函数的图像
Nov 21 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
python zip,lambda,map函数代码实例
Apr 04 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
Python插件机制实现详解
May 04 Python
浅谈Python里面None True False之间的区别
Jul 09 Python
python爬取企查查企业信息之selenium自动模拟登录企查查
Apr 08 Python
Python OpenGL基本配置方式
May 20 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
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
PHP Include文件实例讲解
2019/02/15 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
介绍JavaScript的一个微型模版
2015/06/24 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
微信小程序实现折线图的示例代码
2019/06/07 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
python 批量修改/替换数据的实例
2018/07/25 Python
Selenium定位元素操作示例
2018/08/10 Python
python retrying模块的使用方法详解
2019/09/25 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
django正续或者倒序查库实例
2020/05/19 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
大学毕业登记表自我鉴定
2013/10/09 职场文书
网络技术专业推荐信
2014/02/20 职场文书
考察现实表现材料
2014/05/19 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
大连星海广场导游词
2015/02/10 职场文书
用电申请报告范文
2015/05/18 职场文书
唐山大地震观后感
2015/06/05 职场文书
Redis集群的关闭与重启操作
2021/07/07 Redis
Java实现字符串转为驼峰格式的方法详解
2022/07/07 Java/Android