1、递归版本
对于序列A[0,n]和B[0,m],LCS(A,B)无非三种情况
(0)若n=-1或m=-1,则取做空序列(“”) //递归基
(1)若A[n]='X'=B[m],则取做:LCS(A[0,n),B[0,m))+‘X’ //减而治之
(2)若A[n]!=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'