【动态规划】leetcode每日一题—115.不同的子序列

题目:
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。

字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)

题目数据保证答案符合 32 位带符号整数范围。
【动态规划】leetcode每日一题—115.不同的子序列_第1张图片
思路:
动态规划

解答:

方法一:

class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        m=len(s)
        n=len(t)
        if m<n:
            return 0

        #dp[i][j]:表示s[i:]的子系列中t[j:]出现的个数
        dp=[[0]*(n+1) for _ in range(m+1)]
        for t in range(m+1):
            dp[t][n]=1

        for i in range(m-1,-1,-1):
            for j in range(n-1,-1,-1):
                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]
        return dp[0][0]

方法二:

class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        m=len(s)
        n=len(t)
        if m<n:
            return 0

        #dp[i][j]:以i-1为结尾的s子序列中 出现 以j-1为结尾的t 的个数
        dp=[[0]*(n+1) for _ in range(m+1)]
        for i in range(m+1):
            dp[i][0]=1

        for i in range(m):
            for j in range(n):
                if s[i]==t[j]:
                    #用s[i]和不用s[i]
                    dp[i+1][j+1]=dp[i][j]+dp[i][j+1]
                else:
                    dp[i+1][j+1]=dp[i][j+1]
        return dp[m][n]

你可能感兴趣的:(leetcode,Python,动态规划,leetcode,算法)