力扣 115. 不同的子序列

题目来源:https://leetcode.cn/problems/distinct-subsequences/description/

C++题解:动态规划。

dp[i][j] 表示 t[0] ~ t[i-1] 在 s[0] ~ s[j-1] 中出现的个数。因为 t 短,所以把 t 放在外循环。

当 t[i-1] 不等于 s[j-1] 时,s[j] 长度+1,t[0]~t[i-1]出现的个数不会变,所以dp[i][j] = dp[i][j-1];

当 t[i-1]  等于 s[j-1] 时,如果是s[0],那么dp[i][j]++;但如果不是s[0],那么dp[i][j] 会等于 dp[i-1][j-1] + dp[i][j-1],第一项表示t[i-1]之前子序列出现的个数,第二项表示t[i-1]这项出现的次数。为什么是相加,第一项表示不包含t[i-1]这一项的所有可能,第二项表示一定包含了t[i-1] 这一项的可能,根据排列组合?反正列个表推一下就能感受到。

class Solution {
public:
    int numDistinct(string s, string t) {
        int m = s.size(), n = t.size();
        vector<vector<long long int>> dp(n+1, vector<long long int>(m+1, 0));
        bool flg = true;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                if(s[j-1] == t[i-1]) {
                    dp[i][j] = dp[i-1][j-1] + dp[i][j-1];
                    if(flg && i==1) {dp[i][j] = 1; flg = false;}
                    else if (i==1) dp[i][j] = dp[i][j-1] + 1;
                    if(dp[i][j] >= 1000000007) dp[i][j] -= 1000000007;
                }
                else dp[i][j] = dp[i][j-1];
            }
            if(flg) break;
        }
        return dp[n][m];
    }
};

代码随想录版本:

class Solution {
public:
    int numDistinct(string s, string t) {
        vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1));
        for (int i = 0; i < s.size(); i++) dp[i][0] = 1;
        for (int j = 1; j < t.size(); j++) dp[0][j] = 0;
        for (int i = 1; i <= s.size(); i++) {
            for (int j = 1; j <= t.size(); j++) {
                if (s[i - 1] == t[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
                } else {
                    dp[i][j] = dp[i - 1][j];
                }
            }
        }
        return dp[s.size()][t.size()];
    }
};

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-05 11:34:08       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-05 11:34:08       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-05 11:34:08       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-05 11:34:08       20 阅读

热门阅读

  1. 数据库更新两张相关联的表

    2024-04-05 11:34:08       15 阅读
  2. 【leetcode】向字符串添加空格

    2024-04-05 11:34:08       15 阅读
  3. 2024.3.17力扣每日一题——最小高度树

    2024-04-05 11:34:08       13 阅读
  4. Apache Spark 的基本概念和在大数据分析中的应用

    2024-04-05 11:34:08       14 阅读
  5. WPF如何使用 System.Windows.Forms.FolderBrowserDialog

    2024-04-05 11:34:08       17 阅读
  6. 找出字符串中所有偶数的个数

    2024-04-05 11:34:08       15 阅读
  7. 单例模式的多种写法

    2024-04-05 11:34:08       13 阅读
  8. 设计模式:单例模式六种实现

    2024-04-05 11:34:08       19 阅读
  9. 单例模式详解

    2024-04-05 11:34:08       13 阅读
  10. Visual Studio Code(VS Code)安装教程

    2024-04-05 11:34:08       12 阅读