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简单格式化时间的方法【strftime函数】
Sep 18 Python
神经网络python源码分享
Dec 15 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
Python工厂函数用法实例分析
May 14 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 Python
Python字符串逆序的实现方法【一题多解】
Feb 18 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 Python
初学者学习Python好还是Java好
May 26 Python
Python flask路由间传递变量实例详解
Jun 03 Python
python实现手机推送 代码也就10行左右
Apr 12 Python
Elasticsearch 索引操作和增删改查
Apr 19 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面向对象全攻略 (九)访问类型
2009/09/30 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
2017/04/04 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
python实现自动解数独小程序
2019/01/21 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
土木工程毕业生自荐信
2013/09/21 职场文书
给市场的环保建议书
2014/05/14 职场文书
幼儿园安全生产月活动总结
2014/07/05 职场文书
统计专业自荐书
2014/07/06 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
如何写辞职信
2015/05/13 职场文书
2015少先队大队辅导员工作总结
2015/07/24 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
Python 中random 库的详细使用
2021/06/03 Python
python unittest单元测试的步骤分析
2021/08/02 Python
springboot入门 之profile设置方式
2022/04/04 Java/Android