手机
当前位置:查字典教程网 >脚本专栏 >python >Python最长公共子串算法实例
Python最长公共子串算法实例
摘要:本文实例讲述了Python最长公共子串算法。分享给大家供大家参考。具体如下:#!/usr/bin/envpython#findanLCS(L...

本文实例讲述了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和C语言混合编程实例

Python-基础-入门 简介

python动态监控日志内容的示例

Python 连连看连接算法

Python 字符串定义

python解析json实例方法

python函数返回多个值的示例方法

python冒泡排序算法的实现代码

Python3基础之list列表实例解析

python二叉树的实现实例

精品推荐
分类导航