题目
给定一个字符串 s
,计算 s
的 不同非空子序列 的个数。因为结果可能很大,所以返回答案需要对 10^9 + 7
取余 。
字符串的 子序列 是经由原字符串删除一些(也可能不删除)字符但不改变剩余字符相对位置的一个新字符串。
- 例如,
"ace"
是"***a***b***c***d***e***"
的一个子序列,但"aec"
不是。
示例 1:
输入:s = "abc"
输出:7
解释:7 个不同的子序列分别是 "a", "b", "c", "ab", "ac", "bc", 以及 "abc"。
示例 2:
输入:s = "aba"
输出:6
解释:6 个不同的子序列分别是 "a", "b", "ab", "ba", "aa" 以及 "aba"。
示例 3:
输入:s = "aaa"
输出:3
解释:3 个不同的子序列分别是 "a", "aa" 以及 "aaa"。
提示:
1 <= s.length <= 2000
s
仅由小写英文字母组成
解答
- 动态规划
思路:
class Solution {
public:
int distinctSubseqII(string s) {
vector<int> last(26, -1);
int n = s.size();
vector<int> f(n, 1);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < 26; ++j) {
if (last[j] != -1) {
f[i] = (f[i] + f[last[j]]) % mod;
}
}
last[s[i] - 'a'] = i;
}
int ans = 0;
for (int i = 0; i < 26; ++i) {
if (last[i] != -1) {
ans = (ans + f[last[i]]) % mod;
}
}
return ans;
}
private:
static constexpr int mod = 1000000007;
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/distinct-subsequences-ii/solutions/1888523/bu-tong-de-zi-xu-lie-ii-by-leetcode-solu-k2h5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。