最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Python最长公共子串算法实例

来源:动视网 责编:小采 时间:2020-11-27 14:31:44
文档

Python最长公共子串算法实例

Python最长公共子串算法实例:本文实例讲述了Python最长公共子串算法。分享给大家供大家参考。具体如下: #!/usr/bin/env python # find an LCS (Longest Common Subsequence). # *public domain* def find_lcs_len(s1, s2): m = [ [ 0 for
推荐度:
导读Python最长公共子串算法实例:本文实例讲述了Python最长公共子串算法。分享给大家供大家参考。具体如下: #!/usr/bin/env python # find an LCS (Longest Common Subsequence). # *public domain* def find_lcs_len(s1, s2): m = [ [ 0 for


本文实例讲述了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最长公共子串算法实例:本文实例讲述了Python最长公共子串算法。分享给大家供大家参考。具体如下: #!/usr/bin/env python # find an LCS (Longest Common Subsequence). # *public domain* def find_lcs_len(s1, s2): m = [ [ 0 for
推荐度:
标签: 公共 实例 最长
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top