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 相关文章推荐
Linux下使用python自动修改本机网关代码分享
May 21 Python
Python下rrdtool模块的基本使用方法
Nov 13 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
用Python编写一个简单的CS架构后门的方法
Nov 20 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
浅谈Pycharm调用同级目录下的py脚本bug
Dec 03 Python
Python Pywavelet 小波阈值实例
Jan 09 Python
python实现提取COCO,VOC数据集中特定的类
Mar 10 Python
jupyter notebook 的工作空间设置操作
Apr 20 Python
基于python的opencv图像处理实现对斑马线的检测示例
Nov 29 Python
python字典与json转换的方法总结
Dec 28 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
php实现的简单检验登陆类
2015/06/18 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
jQuery 学习 几种常用方法
2009/06/11 Javascript
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
用队列模拟jquery的动画算法实例
2015/01/20 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
python实现归并排序算法
2018/11/22 Python
python xpath获取页面注释的方法
2019/01/14 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
python 实现屏幕录制示例
2019/12/23 Python
pygame实现飞机大战
2020/03/11 Python
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
大学毕业生通用求职信
2013/09/28 职场文书
大学英语专业求职信
2014/06/21 职场文书
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
交通事故和解协议书
2014/09/25 职场文书
道歉情书大全
2015/05/12 职场文书
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis
5个pandas调用函数的方法让数据处理更加灵活自如
2022/04/24 Python
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript