【陪伴式刷题】Day 48|动态规划|115.不同的子序列(Distinct Subsequence)

21 阅读1分钟

刷题顺序以及题解参考卡哥的代码随想录

题目描述

英文版描述

Given two strings s and t, return the number of distinct subsequences of s which equals t.

The test cases are generated so that the answer fits on a 32-bit signed integer.

Example 1:

Input: s = "rabbbit", t = "rabbit"
Output: 3
Explanation:
As shown below, there are 3 ways you can generate "rabbit" from s.
rabbbit
rabbbit
rabbbit

Example 2:

Input: s = "babgbag", t = "bag"
Output: 5
Explanation:
As shown below, there are 5 ways you can generate "bag" from s.
babgbag
babgbag
babgbag
babgbag
babgbag

Constraints:

  • 1 <= s.length, t.length <= 1000
  • s and t consist of English letters.

英文版地址

leetcode.com/problems/di…

中文版描述

给你两个字符串 s ****和 t ,统计并返回在 s子序列t 出现的个数,结果需要对 10(9) + 7 取模。

示例 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

提示:

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

中文版地址

leetcode.cn/problems/di…

解题方法

class Solution {
    public int numDistinct(String s, String t) {
         if (t.isEmpty()) {
            return 1;
        }
        if (s == null || s.isEmpty() || t.length() > s.length()) {
            return 0;
        }
        int[][] dp = new int[t.length()][s.length()];
        if (t.charAt(0) == s.charAt(0)) {
            dp[0][0] = 1;
        }
        for (int j = 1; j < s.length(); j++) {
            if (t.charAt(0) == s.charAt(j)) {
                dp[0][j] = dp[0][j - 1] + 1;
            } else {
                dp[0][j] = dp[0][j - 1];
            }
        }
        for (int i = 1; i < t.length(); i++) {
            for (int j = 1; j < s.length(); j++) {
                if (t.charAt(i) == s.charAt(j)) {
                    dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1];
                } else {
                    dp[i][j] = dp[i][j - 1];
                }
            }
        }
        return dp[t.length() - 1][s.length() - 1];
    }
}

复杂度分析

  • 时间复杂度:O(n*m),其中 n 是数组t的元素数,m 是数组s的元素数
  • 空间复杂度:O(n*m)