115. 不同的子序列

知道是DP,但就是找不到递推方程,只好拿递归做,从左遍历,遇到第一个匹配的开始对之后的两个字符串递归,复杂度应该是O(N!),指数级的,第51个用例过不去了。

DP[i] [j]表示由s的前i个元素组成的序列A中有多少由t前j个元素组成的序列B。

首先若s的前i-1序列包含t的前j序列,那么s的前i序列也一定包含t的前j序列。
其次若s[i]==t[j],当s的前i-1序列包含t的前j-1序列时,s的前i序列也包含t的前j序列。
故递推方程:
if s[i]==t[j]:
dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
else:
dp[i][j]=dp[i-1][j]

class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        ls,lt=len(s),len(t)
        if not lt or not ls:
            return 0
        dp=[[0 for i in range(lt)] for j in range(ls)]
        #dp[i][j]:s的前i+1个元素(序列a)中出现t的前j+1个元素(序列b)的个数
        dp[0][0]=int(s[0]==t[0])
        for row in range(1,ls):
            if s[row]==t[0]:
                dp[row][0]=dp[row-1][0]+1
            else:
                dp[row][0]=dp[row-1][0]
        for j in range(1,lt):
            for i in range(1,ls):
                #对于每一列从上到下进行
                if s[i]==t[j]:
                    dp[i][j]=dp[i-1][j-1]+dp[i-1][j]
                else:
                    dp[i][j]=dp[i-1][j]
        # print(dp)
        return dp[-1][-1]
# S = "aabdbaabeeadcbbdedacbbeecbabebaeeecaeabaedadcbdbcdaabebdadbbaeabdadeaabbabbecebbebcaddaacccebeaeedababedeacdeaaaeeaecbe"
# T = "bddabdcae"   
# print(Solution().numDistinct(S,T))  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值