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

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'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值