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版的文曲星猜数字游戏代码
Sep 02 Python
python发送邮件接收邮件示例分享
Jan 21 Python
Python 关于反射和类的特殊成员方法
Sep 14 Python
python登录并爬取淘宝信息代码示例
Dec 09 Python
使用python os模块复制文件到指定文件夹的方法
Aug 22 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
Python数据存储之 h5py详解
Dec 26 Python
Python urlopen()和urlretrieve()用法解析
Jan 07 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
使用python创建Excel工作簿及工作表过程图解
May 27 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
使用python绘制横竖条形图
Apr 21 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 print EOF实现方法
2009/05/21 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
详解Angular2中Input和Output用法及示例
2017/05/21 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
从0到1构建vueSSR项目之路由的构建
2019/03/07 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
JS实现数据动态渲染的竖向步骤条
2020/06/24 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
快速入手Python字符编码
2016/08/03 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
Python Lambda函数使用总结详解
2019/12/11 Python
python设置环境变量的作用整理
2020/02/17 Python
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
物流经理自我评价
2013/09/23 职场文书
客服部班长工作责任制
2014/02/25 职场文书
政府信息公开实施方案
2014/05/09 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
西岭雪山导游词
2015/02/06 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js