在重构最长公共子序列时,只利用表c,也就是用于保存各子问题的LCS长度,运行时间依然为O(m+n),以下为基于python语言编写的代码:
def LCS_Length(X,Y):#输出最长公共子序列的长度以及记录最优解的构造过程 m=len(X)-1 n=len(Y)-1 a=[[0]*(n+1)]*(m+1) b=[[None]*(n+1)]*(m+1) c=numpy.array(a)#c用于保存c[i,j]的最长公共子序列的长度 for i in range(1,m+1): for j in range(1,n+1): if X[i]==Y[j]: c[i,j]=c[i-1,j-1]+1 elif c[i-1,j]>=c[i,j-1]: c[i,j]=c[i-1,j] else: c[i,j]=c[i,j-1] return c
def print_LCS(c,X,Y,i,j):#只利用c if i==0 or j==0: return elif X[i]==Y[j]: print_LCS(c,X,Y,i-1,j-1) print X[i] elif c[i-1,j]>=c[i,j-1]: print_LCS(c,X,Y,i-1,j) else: print_LCS(c,X,Y,i,j-1)
if __name__=="__main__": X=[1,0,0,1,0,1,0,1] Y=[0,1,0,1,1,0,1,1,0] A=[None] A.extend(X) B=[None] B.extend(Y) c=LCS_Length(A,B) print_LCS(c,A,B,8,9)