难度困难
给定一个字符串 s
,计算 s
的 不同非空子序列 的个数。因为结果可能很大,所以返回答案需要对 10^9 + 7
取余 。
字符串的 子序列 是经由原字符串删除一些(也可能不删除)字符但不改变剩余字符相对位置的一个新字符串。
- 例如,
"ace"
是"abcde"
的一个子序列,但"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
仅由小写英文字母组成
分析:不会!cv
class Solution {
public int distinctSubseqII(String s) {
int mod = (int)1e9 + 7;
int n = s.length();
int[] preCount = new int[26]; // 之前新增的个数
int curAns = 1;
char[] chars = s.toCharArray();
for (int i = 0;i < n; i++){
// 新增的个数
int newCount = curAns;
// 当前序列的个数 = 之前的 + 新增的 - 重复的
curAns = ((curAns + newCount)%mod - preCount[chars[i] - 'a'] % mod + mod) % mod;
// 记录当前字符的 新增值
preCount[chars[i] - 'a'] = newCount;
}
// 减去空串
return curAns - 1;
}
}
执行结果:
通过
显示详情
添加备注
执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:39.5 MB, 在所有 Java 提交中击败了97.41%的用户
通过测试用例:109 / 109