LCS Returns

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'))
    

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值