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使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
Python实现将xml导入至excel
Nov 20 Python
Python实现Linux的find命令实例分享
Jun 04 Python
python爬虫_微信公众号推送信息爬取的实例
Oct 23 Python
Python正则表达式和元字符详解
Nov 29 Python
Python3 itchat实现微信定时发送群消息的实例代码
Jul 12 Python
python中struct模块之字节型数据的处理方法
Aug 27 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
May 26 Python
Python绘图之柱形图绘制详解
Jul 28 Python
Python如何读写CSV文件
Aug 13 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
python神经网络编程之手写数字识别
May 08 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/11/12 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
2017/10/11 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
Python通过正则表达式选取callback的方法
2015/07/18 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
pyqt5 从本地选择图片 并显示在label上的实例
2019/06/13 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
Python调用百度OCR实现图片文字识别的示例代码
2020/07/17 Python
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
军训鉴定表自我鉴定
2014/02/13 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
公司会议策划方案
2014/05/17 职场文书
推广普通话标语
2014/06/27 职场文书
挂职学习心得体会
2014/09/09 职场文书
企业年检委托书范本
2014/10/14 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers