115. 不同的子序列

发布时间 2023-06-06 16:53:49作者: xiazichengxi

给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。

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


示例 1:

输入:s = "rabbbit", t = "rabbit"
输出:3
解释:
如下所示, 有 3 种可以从 s 中得到 "rabbit" 的方案。
rabbbit
rabbbit
rabbbit

> 动态规划

首先dp[i][j]表示 以j-1为结尾的字符串的子序列中以i-1为结尾的字符串出现的个数;
如果t[i-1] 不等于 s[j-1] 则个数为dp[i][j-1];
如果t[i-1] 等于 s[j-1] 则个数为
** 此时情况分为两种**
** 1. 以s[j-1] 为结尾的子序列,则匹配的个数为dp[i-1][j-1];**
** 2. 不以s[j-1]为结尾的子序列但是依然匹配的,则个数为dp[i][j-1];**


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