您的位置:首页 > 其它

最长公共子序列问题(LCS)

2015-06-05 15:52 190 查看
1、递归版本

对于序列A[0,n]和B[0,m],LCS(A,B)无非三种情况

(0)若n=-1或m=-1,则取做空序列(“”) //递归基

(1)若A
='X'=B[m],则取做:LCS(A[0,n),B[0,m))+‘X’ //减而治之

(2)若A
!=B[m],则在LCS(A[0,n],B[0,m) ) 与LCS(A[0,n),B[0,m] )中取更长者 //分而治之

def LCS(A,B):

if(len(A)==0 or len(B)==0):

return ""

if(A[-1]==B[-1]):

return LCS(A[0:-1],B[0:-1])+A[-1]

else:

tmp1,tmp2 = LCS(A[0:],B[0:-1]),LCS(A[0:-1],B[0:])

if(len(tmp1)>len(tmp2)):

return tmp1

else:

return tmp2

复杂的为O(2^n)

2、迭代版本

采用二维数组记录每个过程。复杂度为O(n*m)。 PS:输出子串,只输出了长度

def LCS(A,B):

table = []

for i in range(len(A)+1):

table.append([])

for j in range(len(B)+1):

table[i].append(0)

for i in range(len(A)):

for j in range(len(B)):

if(A[i]==B[j]):

substring += A[i]

table[i+1][j+1] = table[i][j]+1

else:

table[i+1][j+1] = max(table[i+1][j],table[i][j+1])

for i in range(len(A)):

for j in range(len(B)):

print table[i][j],'\t',

print '\n'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: