当前位置 博文首页 > 文章内容

    leetcode刷题笔记一百一十五题 不同的子序列

    作者: 栏目:未分类 时间:2020-08-07 18:00:33

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    leetcode刷题笔记一百一十五题 不同的子序列

    源地址:115. 不同的子序列

    问题描述:

    给定一个字符串 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 <= i <= s.length dp(0)(i) = 1
    状态转移方程: 1 <= i <= t.length, 1 <= j <= s.length
    t(i-1) == s(j-1), dp(i)(j) = dp(i-1)(j-1) + dp(i-1)(j)
    t(i-1) != s(j-1), dp(i)(j) = dp(i-1)(j)
    */
    object Solution {
        def numDistinct(s: String, t: String): Int = {
            val dp = Array.fill(t.length+1, s.length+1)(0)
            for (i <- 0 to s.length) dp(0)(i) = 1
    
            for (i <- 1 to t.length){
                for (j <- 1 to s.length){
                    if (t(i-1) == s(j-1)) dp(i)(j) = dp(i)(j-1) + dp(i-1)(j-1)
                    else dp(i)(j) = dp(i)(j-1)
                }
            }
            return dp(t.length)(s.length)
        }
    }