算法导论第三版第15章课后答案15.4-2(python语言编写)

在重构最长公共子序列时,只利用表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)




你可能感兴趣的:(算法导论第三版第15章课后答案15.4-2(python语言编写))