zoukankan      html  css  js  c++  java
  • LeetCode 115. 不同的子序列

    115. 不同的子序列

    Difficulty: 困难

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

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

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

    示例 1:

    输入:s = "rabbbit", t = "rabbit"
    输出:3
    解释:
    如下图所示, 有 3 种可以从 s 中得到 "rabbit" 的方案。
    (上箭头符号 ^ 表示选取的字母)
    rabbbit
    ^^^^ ^^
    rabbbit
    ^^ ^^^^
    rabbbit
    ^^^ ^^^
    

    示例 2:

    输入:s = "babgbag", t = "bag"
    输出:5
    解释:
    如下图所示, 有 5 种可以从 s 中得到 "bag" 的方案。 
    (上箭头符号 ^ 表示选取的字母)
    babgbag
    ^^ ^
    babgbag
    ^^    ^
    babgbag
    ^    ^^
    babgbag
      ^  ^^
    babgbag
        ^^^
    

    提示:

    • 0 <= s.length, t.length <= 1000
    • st 由英文字母组成

    Solution

    这道题的动态转移方程是当s中的字符和t中的字符相同时,此时dp[i][j] = dp[i-1][j-1] + dp[i][j-1],即t中前i-1个字符和s中前j-1个字符的子问题解的数量与忽略s[j]元素(s中前j-1个元素)解的数量之和

    class Solution:
        def numDistinct(self, s: str, t: str) -> int:
            ls, lt = len(s), len(t)
            dp = [[0] * (ls+1) for _ in range(lt+1)]
            dp[0] = [1] * (ls+1)
            
            for i in range(1, lt+1):
                for j in range(1, ls+1):
                    if t[i-1] == s[j-1]:
                        dp[i][j] = dp[i-1][j-1] + dp[i][j-1]
                    else:
                        dp[i][j] = dp[i][j-1]
            return dp[lt][ls]
    
  • 相关阅读:
    BZOJ 2038 小Z的袜子 莫队算法
    POJ 3407 球面距离
    POJ 1375 圆的切线
    BZOJ 1502 月下柠檬树 simpson积分
    UVA 11704
    POJ 1981 定长圆覆盖最多点
    HDU 3982 半平面交+圆和凸多边形面积并
    ZOJ 1104 二分
    使用Singleton来实现Flash和Flex的通信。
    校内API相关
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14552864.html
Copyright © 2011-2022 走看看