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中 ? : 三元表达式的使用介绍
Oct 09 Python
python实现无证书加密解密实例
Oct 27 Python
Python查询IP地址归属完整代码
Jun 21 Python
python中reduce()函数的使用方法示例
Sep 29 Python
Python爬虫实现百度图片自动下载
Feb 04 Python
Python中__slots__属性介绍与基本使用方法
Sep 05 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
python 矢量数据转栅格数据代码实例
Sep 30 Python
python列表生成器迭代器实例解析
Dec 19 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
python pymysql库的常用操作
Oct 16 Python
python 统计代码耗时的几种方法分享
Apr 02 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
PHP与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
php curl模拟post请求小实例
2013/11/13 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
PHP实现截取中文字符串不出现?号的解决方法
2016/12/29 PHP
php技巧小结【推荐】
2017/01/19 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
2019/05/31 PHP
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
node.js中的path.normalize方法使用说明
2014/12/08 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
Electron实现应用打包、自动升级过程解析
2020/07/07 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
[00:23]DOTA2群星共贺开放测试 25日无码时代来袭
2013/09/23 DOTA
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
python处理“
2019/06/10 Python
python的Jenkins接口调用方式
2020/05/12 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
JSF的标签库有哪些
2012/04/27 面试题
大四学生毕业自荐信
2013/11/07 职场文书
后勤部长岗位职责
2013/12/14 职场文书
音乐幼师求职信
2014/07/09 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
同学聚会通知书
2015/04/20 职场文书
身份证丢失证明
2015/06/19 职场文书
python实现会员信息管理系统(List)
2022/03/18 Python