Python最长公共子串算法实例


Posted in Python onMarch 07, 2015

本文实例讲述了Python最长公共子串算法。分享给大家供大家参考。具体如下:

#!/usr/bin/env python 
# find an LCS (Longest Common Subsequence). 
# *public domain* 
 
def find_lcs_len(s1, s2): 
 m = [ [ 0 for x in s2 ] for y in s1 ] 
 for p1 in range(len(s1)): 
  for p2 in range(len(s2)): 
   if s1[p1] == s2[p2]: 
    if p1 == 0 or p2 == 0: 
     m[p1][p2] = 1
    else: 
     m[p1][p2] = m[p1-1][p2-1]+1
   elif m[p1-1][p2] < m[p1][p2-1]: 
    m[p1][p2] = m[p1][p2-1] 
   else:               # m[p1][p2-1] < m[p1-1][p2] 
    m[p1][p2] = m[p1-1][p2] 
 return m[-1][-1] 
 
def find_lcs(s1, s2): 
 # length table: every element is set to zero. 
 m = [ [ 0 for x in s2 ] for y in s1 ] 
 # direction table: 1st bit for p1, 2nd bit for p2. 
 d = [ [ None for x in s2 ] for y in s1 ] 
 # we don't have to care about the boundery check. 
 # a negative index always gives an intact zero. 
 for p1 in range(len(s1)): 
  for p2 in range(len(s2)): 
   if s1[p1] == s2[p2]: 
    if p1 == 0 or p2 == 0: 
     m[p1][p2] = 1
    else: 
     m[p1][p2] = m[p1-1][p2-1]+1
    d[p1][p2] = 3          # 11: decr. p1 and p2 
   elif m[p1-1][p2] < m[p1][p2-1]: 
    m[p1][p2] = m[p1][p2-1] 
    d[p1][p2] = 2          # 10: decr. p2 only 
   else:               # m[p1][p2-1] < m[p1-1][p2] 
    m[p1][p2] = m[p1-1][p2] 
    d[p1][p2] = 1          # 01: decr. p1 only 
 (p1, p2) = (len(s1)-1, len(s2)-1) 
 # now we traverse the table in reverse order. 
 s = [] 
 while 1: 
  print p1,p2 
  c = d[p1][p2] 
  if c == 3: s.append(s1[p1]) 
  if not ((p1 or p2) and m[p1][p2]): break
  if c & 2: p2 -= 1
  if c & 1: p1 -= 1
 s.reverse() 
 return ''.join(s) 
 
if __name__ == '__main__': 
 print find_lcs('abcoisjf','axbaoeijf') 
 print find_lcs_len('abcoisjf','axbaoeijf')

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python实现带声音的摩斯码翻译实现方法
May 20 Python
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
5款非常棒的Python工具
Jan 05 Python
python 日志增量抓取实现方法
Apr 28 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
Python使用pandas对数据进行差分运算的方法
Dec 22 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
python实现登录密码重置简易操作代码
Aug 14 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
Python: 传递列表副本方式
Dec 19 Python
浅谈keras的深度模型训练过程及结果记录方式
Jan 24 Python
python代码实现扫码关注公众号登录的实战
Nov 01 Python
Python复制目录结构脚本代码分享
Mar 06 #Python
python获取android设备的GPS信息脚本分享
Mar 06 #Python
Python写的英文字符大小写转换代码示例
Mar 06 #Python
Python脚本实现集群检测和管理功能
Mar 06 #Python
Python守护进程(daemon)代码实例
Mar 06 #Python
Python类方法__init__和__del__构造、析构过程分析
Mar 06 #Python
Python列表生成器的循环技巧分享
Mar 06 #Python
You might like
memcache命令启动参数中文解释
2014/01/13 PHP
JavaScript 代码压缩工具小结
2012/02/27 Javascript
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
python如何通过protobuf实现rpc
2016/03/06 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
Python小白垃圾回收机制入门
2020/06/09 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
python requests库的使用
2021/01/06 Python
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
怎样声明一个匿名的内部类
2016/06/01 面试题
研发工程师的岗位职责
2013/11/18 职场文书
十月份红领巾广播稿
2014/01/22 职场文书
安全生产汇报材料
2014/02/17 职场文书
企业管理毕业生求职信范文
2014/03/07 职场文书
《泉水》教学反思
2014/04/11 职场文书
关于安全演讲稿
2014/05/09 职场文书
重阳节慰问信
2015/02/15 职场文书
nginx之内存池的实现
2022/06/28 Servers