码迷,mamicode.com
首页 > 编程语言 > 详细

最长公共子串和子序列的Python实现,带图示。

时间:2017-08-17 18:34:58      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:com   关系   long   技术分享   pytho   range   bdc   bcb   .com   

使用矩阵来记录两个子串之间各个字符之间的对应关系。

最长子串:矩阵中数字最大的就是最长子串的长度。若对应位置字符相同,则c[i][j] = c[i-1][j-1] + 1

 

技术分享

 1 def longSubStr(str1,str2):
 2     len1 = len(str1)
 3     len2 = len(str2)
 4     longest,start1,start2 = 0,0,0
 5     c = [[0 for i in range(len2+1)]for i in range(len1+1)]
 6     for i in range(len1+1):
 7         for j in range(len2+1):
 8             if i == 0 or j == 0:
 9                 c[i][j] = 0
10             elif str1[i-1] == str2[j-1]:
11                 c[i][j] = c[i-1][j-1]+1                 
12             else:
13                 c[i][j] = 0
14             if (longest < c[i][j]):             
15                 longest = c[i][j]
16                 start1 = i-longest
17                 start2 = j-longest
18              
19     return str1[start1:start1+longest],start1,start2

 

最长子序列:若对应位置字符相同,则c[i][j] = c[i-1][j-1] + 1,若不同,则max(c[i][j-1],c[i-1][j]).

技术分享 

技术分享

 

 1 def printLcs(flag,a,i,j):     
 2     if i==0 or j==0:  
 3         return  
 4     if flag[i][j]==OK:  
 5         printLcs(flag,a,i-1,j-1)  
 6         print a[i-1],
 7     elif flag[i][j]==Left:  
 8         printLcs(flag,a,i,j-1)  
 9     else:  
10         printLcs(flag,a,i-1,j)  
11 
12 def longSubSeq(str1,str2):
13     len1 = len(str1)
14     len2 = len(str2)
15     longest = 0
16     c = [[0 for i in range(len2+1)]for i in range(len1+1)]
17     flag = [[0 for i in range(len2+1)]for i in range(len1+1)]  
18     for i in range(len1+1):
19         for j in range(len2+1):
20             if i == 0 or j == 0:
21                 c[i][j] = 0
22             elif str1[i-1] == str2[j-1]:
23                 c[i][j] = c[i-1][j-1]+1 
24                 flag[i][j] = OK
25                 longest = max(longest,c[i][j])              
26             elif c[i][j-1] > c[i-1][j]:
27                 c[i][j] =c[i][j-1]
28                 flag[i][j] = Left
29             else:
30                 c[i][j] =c[i-1][j]
31                 flag[i][j] = UP
32     printLcs(flag,str1,len1,len2)       
33     return longest
34 a=ABCBDAB  
35 b=BDCABA  
36 print longSubSeq(a,b)

 

最长公共子串和子序列的Python实现,带图示。

标签:com   关系   long   技术分享   pytho   range   bdc   bcb   .com   

原文地址:http://www.cnblogs.com/yuling-chao/p/7383096.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!