LCS Returns

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjucor/article/details/82657851

https://www.hackerrank.com/challenges/tutzki-and-lcs/problem

在a中加入的那个数一定要与b中的某个数match上,然后ab各分成2部分,分别求2个pair的LCS,然后枚举一下a加入的位置就好了。

不必每次求2个pair的LCS,先跑一遍全部长度的ab的LCS即可


def LCS(a, b):
    na,nb=len(a),len(b)
    dp=[[0 for _ in range(nb)] for _ in range(na)]
    for i in range(na):
        for j in range(nb):
            if a[i]==b[j]: dp[i][j]=(dp[i-1][j-1] if i>=1 and j>=1 else 0)+1
            else: dp[i][j]=max(dp[i-1][j] if i>=1 else 0,dp[i][j-1] if j>=1 else 0)
    return dp


def tutzkiAndLcs(a, b):
    na,nb=len(a),len(b)
    dp1=LCS(a,b)
    dp2=LCS(a[::-1],b[::-1])
    prev=dp1[-1][-1]
    res=set()
#    print(prev)
#    print(dp1)
#    print(dp2)
    for i in range(0,len(a)+1):
        for j in range(len(b)):
            if (i,b[j]) in res: continue
            t=0
            if i!=0 and j!=0: t+=dp1[i-1][j-1]
            if i!=na and j!=nb-1: t+=dp2[na-1-i][nb-1-j-1]
            if t==prev: 
#                print(i,j)
                res.add((i,b[j]))
    return len(res)


if __name__ == '__main__':
    a = input()
    b = input()
    result = tutzkiAndLcs(a, b)
    print(result)

#print(tutzkiAndLcs('aa', 'baaa'))
    

猜你喜欢

转载自blog.csdn.net/zjucor/article/details/82657851
LCS