leetcode解题笔记-Distinct Subsequences

题目地址:https://oj.leetcode.com/problems/distinct-subsequences/

利用动态规划处理,当利用动态规划时,需要用一个数据结构保存处理过的数据,设计一个合理的结构来表示处理过程是解决动态规划问题的关键

利用二维数组来表示arr[j][i]表示S中0-i之间的字符串能够满足包含T中前j个字符串的方法数。以aaabbb为例,最终得到的数组如下

1 1 0

1 2 0

1 3 0

1 3 3

1 3 6

1 3 9

可以发现规律如下当T[i-1]与S[j]相等时,arr[j][i] = arr[j-1][i]+arr[j-1][i-1]

如果T[i-1]与S[j]不相等时,arr[j][i] = arr[j-1][i]

在解题的过程中,我错误地初始化了数组,将数组初始化为0,实际上arr[j][0]应该为1。所以正确初始化也是动态规划的关键之一。

最终代码如下

class Solution:
    # @return an integer
    def numDistinct(self, S, T):
        height = len(S)
        width = len(T)
        if width==0:
            return 1
        if width > height:
            return 0
        arr = [[1 if j==0 else 0 for j in range(0,width+1)] for i in range(0,height)]
        for i in range(1,width+1):
            for j in range(i-1,height):
                if T[i-1] == S[j]:
                    if j==0 :
                        arr[j][i] = 1
                    else:
                        arr[j][i] = arr[j-1][i] + arr[j-1][i-1]
                else:
                    if j==0:
                        arr[j][i] = 0
                    else:
                        arr[j][i] = arr[j-1][i]
        return arr[height-1][width]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值