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中的XML库4Suite Server的介绍
Apr 14 Python
django中的HTML控件及参数传递方法
Mar 20 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
May 18 Python
使用pip发布Python程序的方法步骤
Oct 11 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
Python中format()格式输出全解
Apr 12 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
Python生成器next方法和send方法区别详解
May 30 Python
使用pycharm和pylint检查python代码规范操作
Jun 09 Python
使用pipenv管理python虚拟环境的全过程
Sep 25 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安全配置方法
2007/06/16 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
JQuery 实现文件下载的常用方法分析
2019/10/29 jQuery
解决VUE双向绑定失效的问题
2019/10/29 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
python 字符串格式化代码
2013/03/17 Python
python二叉树的实现实例
2013/11/21 Python
Python的requests网络编程包使用教程
2016/07/11 Python
Python中的日期时间处理详解
2016/11/17 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
Android面试题及答案
2015/09/04 面试题
开放系统互连参考模型
2016/06/29 面试题
某公司部分笔试题
2013/11/05 面试题
2014年卫生保健工作总结
2014/12/08 职场文书
成绩单评语
2015/01/04 职场文书
首席执行官观后感
2015/06/03 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers