详解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生成pdf文件的方法
Aug 04 Python
Python中dictionary items()系列函数的用法实例
Aug 21 Python
Python中用于计算对数的log()方法
May 15 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
Jul 17 Python
Python中标准库OS的常用方法总结大全
Jul 19 Python
Python实现的求解最大公约数算法示例
May 03 Python
python使用rpc框架gRPC的方法
Aug 24 Python
python二分法查找算法实现方法【递归与非递归】
Dec 06 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
May 22 Python
python跨文件使用全局变量的实现
Nov 17 Python
python3判断IP地址的方法
Mar 04 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和ACCESS写聊天室(六)
2006/10/09 PHP
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
phpQuery占用内存过多的处理方法
2013/11/13 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
图解js图片轮播效果
2015/12/20 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
JavaScript 如何计算文本的行数的实现
2020/09/14 Javascript
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
Java程序开发中如何应用线程
2016/03/03 面试题
寄语十八大感言
2014/02/07 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
员工福利申请报告
2015/05/15 职场文书