Python版day55

392. 判断子序列

 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/is-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        len1 = len(s)
        len2 = len(t)
        if len2<len1:
            return False
        # dp[i][j] means string s ends with i-1 
        # AND string t ends with j-1 has same subsequence length dp[i][j]
        dp = [[0]*(len2+1) for _ in range(len1+1)]
        for i in range(1,len1+1):
            charS = s[i-1]
            for j in range(1,len2+1):
                charT = t[j-1]
                if charS == charT:
                    dp[i][j] = dp[i-1][j-1] +1
                else: 
                # 相当于t要删除元素 继续匹配;删除t[j-1]  等同于s[i-1]与t[j-2]比较结果
                    dp[i][j] = dp[i][j-1]
        return dp[len1][len2] == len1

 115. 不同的子序列

给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。

题目数据保证答案符合 32 位带符号整数范围。

 

class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        len1 = len(s)
        len2 = len(t)
        # 以i-1结尾的s子序列出现在以j-1结尾的t的个数为dp[i][j]
        dp = [[0 for _ in range(len2+1)] for _ in range(len1+1)]
        # s[i - 1] 与 t[j - 1]相等,dp[i][j]由两部分组成
        # 1. 需要s[i - 1]匹配,那么个数为dp[i-1][j-1]
        # 2. 不需要s[i - 1]匹配,那么个数为dp[i-1][j] {bagg,bag} s[2]==t[2]但不一定要使用s[2]也可以用s[3]
        # s[i - 1] 与 t[j - 1] 不相等, dp[i][j]由一部分组成
        # 1.不需要s[i - 1]匹配,那么个数为dp[i-1][j]

        # dp[i][0] 意味着s[i-1]中空字符串的个数 为1
        for i in range(len1+1):
            dp[i][0] = 1
        # dp[0][j] 意味着空字符串中[j-1]的个数 为0
        for j in range(len2+1):
            dp[0][j] = 0
        # 注意dp[0][0] =1
        # 空字符串可以删除0个元素变成空字符串
        dp[0][0] = 1
        # 遍历顺序 从上到下 从左到右
        for i in range(1,len1+1):
            for j in range(1,len2+1):
                charS = s[i-1]
                charT = t[j-1]
                if charS == charT:
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
                else:
                    dp[i][j] = dp[i-1][j]
        return dp[len1][len2]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值