跳到主要内容

940.不同的子序列II

链接:940.不同的子序列II
难度:Hard
标签:字符串、动态规划
简介:给定一个字符串 s,计算 s 的 不同非空子序列 的个数。因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。

题解 1 - cpp

  • 编辑时间:2022-10-14
  • 执行用时:160ms
  • 内存消耗:8.4MB
  • 编程语言:cpp
  • 解法介绍:动态规划,每个点记录当前值和遍历过的后个节点。
const int mod = 1e9 + 7;
struct Item {
int val;
bool next[26];
Item(): val(0) {
memset(next, 0, sizeof(bool) * 26);
}
};
class Solution {
public:
int distinctSubseqII(string s) {
int n = s.size(), ans = 0;
bool charList[26] = {0};
vector<Item> dp(n);
for (int i = 0; i < n; i++) {
char c = s[i];
if (charList[c - 'a'] == 0) dp[i].val += 1, charList[c - 'a'] = 1;
for (int j = 0; j < i; j++) {
if (dp[j].next[c - 'a']) continue;
dp[j].next[c - 'a'] = true;
dp[i].val = (dp[i].val + dp[j].val) % mod;
}
ans = (ans + dp[i].val) % mod;
}
return ans;
}
};