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]
    
  • 相关阅读:
    js sort方法根据数组中对象的某一个属性值进行排序
    JS中数据类型转换
    DOM盒子模型常用属性client,offset和scroll
    Vue之render渲染函数和JSX的应用
    北漂程序员的真实奋斗史:有辛酸,更有成长
    比高房价更可怕的是,35岁以后你还能干嘛?
    Vue组件间通信方式
    根据对象的某个属性名的值从新排序
    JS隐藏号码中间4位
    javascript之揭示模式
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14552864.html
Copyright © 2011-2022 走看看