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 <= s.length, t.length <= 1000
  • s 和 t 由英文字母组成
 1 class Solution {
 2 public:
 3     int numDistinct(string t, string s) {
 4         uint64_t n = s.size();
 5         uint64_t m = t.size();
 6         // s[:i] 在t[:j] 出现的个数
 7         uint64_t dp[n+1][m+1];
 8 
 9         // s[:i] 在空字符串中出现的次数是0
10         for(uint64_t i = 0;i < n+1; i++) {
11             dp[i][0] = 0;
12         }
13         // 空字符串 在 t子序列中出现的次数1
14         for(uint64_t j = 0; j < m+1;j++) {
15             dp[0][j] = 1;
16         }
17         dp[0][0] = 1;
18         // 空字符串 在 空字符串子序列中出现的次数1
19 
20         for(uint64_t i =1;i<n+1;i++) {
21             for(uint64_t j = 1;j < m+1;j++) {
22                 if(s[i-1]==t[j-1]) {
23                     // 删除 t[i] s[j] 都可以删除 
24     
25                     dp[i][j] = dp[i-1][j-1] + dp[i][j-1];
26                 } else {
27                     // 删除 t[j]
28                     dp[i][j] = dp[i][j-1];
29                 }
30             }
31         }
32 
33 
34         return dp[n][m];
35     }
36 };
原文地址:https://www.cnblogs.com/zle1992/p/15265569.html