LeetCode-940 hard不同的子序列 II

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-940 hard不同的子序列 II相关的知识,希望对你有一定的参考价值。


题干:

​力扣​

【LeetCode-940

 

解题报告:

dp[i]代表以s[i]结尾的子序列数量。

然后再加一层循环枚举倒数第二个字符。

dp之后考虑去重(或者直接再用一个数组cnted[26]表示a~z字符结尾的子序列已经有多少个了)然后直接作差就可以,因为不难证明,cnted[s[i]-a]统计的,是dp[i]的真子集,所以所有s[i]结尾的都可以减去。

AC代码:

class Solution 
public:
int p[20005][26];
long long dp[20005];
const int mod = 1e9 +7;
int distinctSubseqII(string s)
memset(p[0], -1, sizeof(p[0]));
p[0][s[0]-a] = 0;
for(int i = 1; i<s.size(); i++)
for(int j = 0; j<26; j++)
if(j == s[i]-a) p[i][j] = i;
else p[i][j] = p[i-1][j];


dp[0]=1;
for(int i = 1; i<s.size(); i++)
dp[i] = 1;
for(int j = 0; j<i; j++)
if(s[j] != s[i]) dp[i] += dp[j];

dp[i] %= mod;

int ans = 0;
for(int i = 0; i<s.size(); i++)
ans = (ans + dp[i])%mod;

return ans;

;

以上是关于LeetCode-940 hard不同的子序列 II的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 940 不同的子序列 II[动态规划] HERODING的LeetCode之路

Codeforcecs1183H Subsequence(hard version) 求字符串本质不同子序列个数

[CF1183H] Subsequences (hard version) - dp

[CF1183H] Subsequences (hard version) - dp

LeetCode(115):不同的子序列

第十周 Leetcode 546. Remove Boxes (HARD) 记忆化搜索