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实例之wxpython中Frame使用方法
Jun 09 Python
Python 抓取动态网页内容方案详解
Dec 25 Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
python脚本作为Windows服务启动代码详解
Feb 11 Python
pycharm 在windows上编辑代码用linux执行配置的方法
Oct 27 Python
Python高斯消除矩阵
Jan 02 Python
python数据归一化及三种方法详解
Aug 06 Python
Python中six模块基础用法
Dec 08 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
Keras loss函数剖析
Jul 06 Python
详解python with 上下文管理器
Sep 02 Python
python 获取域名到期时间的方法步骤
Feb 10 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 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
两种php实现图片上传的方法
2016/01/22 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
js识别不同浏览器基于userAgent做判断
2014/07/29 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
js实现导航吸顶效果
2017/02/24 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
django 创建过滤器的实例详解
2017/08/14 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
wxpython布局的实现方法
2019/11/01 Python
Python高级property属性用法实例分析
2019/11/19 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
妇联主席先进事迹
2014/05/18 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
爱心助学感谢信
2015/01/21 职场文书
出纳试用期自我评价
2015/03/10 职场文书
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
分享几个简单MySQL优化小妙招
2022/03/31 MySQL
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers