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的Django框架中的Memcached
Jul 23 Python
使用Python编写爬虫的基本模块及框架使用指南
Jan 20 Python
Python数组定义方法
Apr 13 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
Python3 中把txt数据文件读入到矩阵中的方法
Apr 27 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
May 18 Python
pycharm修改file type方式
Nov 19 Python
wxpython实现按钮切换界面的方法
Nov 19 Python
pandas-resample按时间聚合实例
Dec 27 Python
python 用struct模块解决黏包问题
Nov 07 Python
90行Python代码开发个人云盘应用
Apr 20 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
单位速度在实战中的运用
2020/03/04 星际争霸
无数据库的详细域名查询程序PHP版(5)
2006/10/09 PHP
PHP IPV6正则表达式验证代码
2010/02/16 PHP
深入php处理整数函数的详解
2013/06/09 PHP
深入解析PHP内存管理之谁动了我的内存
2013/06/20 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
php实现阳历阴历互转的方法
2015/10/28 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
jQuery ajax cache缓存问题
2010/07/01 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
JavaScript中string对象
2015/06/12 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
angular2 ng2 @input和@output理解及示例
2017/10/10 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
Python内置函数reversed()用法分析
2018/03/20 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
Python持续监听文件变化代码实例
2020/07/22 Python
Pytest测试框架基本使用方法详解
2020/11/25 Python
澳大利亚家具商店:Freedom
2020/12/17 全球购物
历史学专业个人的自我评价
2013/10/13 职场文书
店长助理岗位职责
2013/12/13 职场文书
办公室主任先进事迹
2014/01/18 职场文书
学雷锋日活动总结
2015/02/06 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书