day55|动态规划15

392.判断子序列

思路: 只需要判断最大子序列是否和s的长度相同即可,还可以使用双指针的方法进行求解。

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        dp = [[0] * (len(t)+1) for _ in range(len(s)+1)]
        for i in range(1, len(s)+1):
            for j in range(1, len(t)+1):
                if s[i-1] == t[j-1]:
                    dp[i][j] = dp[i-1][j-1] + 1
                else:
                    dp[i][j] = dp[i][j-1]
        if dp[-1][-1] == len(s):
            return True
        return False

115.不同的子序列

  1. dp[i][j]: 在以i-1为结尾的字符串中有以j-1为结尾的个数。
class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        # s有多少个t这样的子序列
        dp = [[0] * (len(t)+1) for _ in range(len(s)+1)]
        for i in range(len(s)):
            dp[i][0] = 1 
        for j in range(1, len(t)):
            dp[0][j] = 0
        for i in range(1, len(s)+1):
            for j in range(1, len(t)+1):
                # 判断是否相同:i-1为结尾的s中有多少个j-1为结尾的个数,
                if s[i-1] == t[j-1]:
                    # 使用s[i-1]的情况和不使用s[i-1]相加,
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
                else:
                    dp[i][j] = dp[i-1][j]
        return dp[-1][-1]

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