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的一些用法分享
Oct 07 Python
对于Python的Django框架使用的一些实用建议
Apr 03 Python
Python遍历pandas数据方法总结
Feb 09 Python
深入理解Django的中间件middleware
Mar 14 Python
Anaconda入门使用总结
Apr 05 Python
pandas 层次化索引的实现方法
Jul 06 Python
Python:二维列表下标互换方式(矩阵转置)
Dec 02 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
Python 为什么推荐蛇形命名法原因浅析
Jun 18 Python
Python Matplotlib绘图基础知识代码解析
Aug 31 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
python 批量将中文名转换为拼音
Feb 07 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中根据变量的类型 选择echo或dump
2012/07/05 PHP
PHP Directory 函数的详解
2013/03/07 PHP
php防止sql注入简单分析
2015/03/18 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
JQuery控制radio选中和不选中方法总结
2015/04/15 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
jquery编写日期选择器
2017/03/16 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
使用python分析git log日志示例
2014/02/27 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
C# .NET面试题
2015/11/28 面试题
县优秀教师事迹材料
2014/01/31 职场文书
护理目标管理责任书
2014/07/25 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
2014年团支书工作总结
2014/11/14 职场文书
发布会邀请函
2015/01/31 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
请客吃饭开场白
2015/06/01 职场文书
MongoDB使用profile分析慢查询的步骤
2021/04/30 MongoDB
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang