File tree Expand file tree Collapse file tree 1 file changed +44
-0
lines changed Expand file tree Collapse file tree 1 file changed +44
-0
lines changed Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ static constexpr int MOD = 1'000'000'007;
3
+ public:
4
+ int possibleStringCount(string word, int k) {
5
+ vector<int> groups;
6
+ for(int i = 0, n = word.size(); i < n; ) {
7
+ int j = i+1;
8
+ while(j<n && word[j]==word[i]) j++;
9
+ groups.push_back(j - i);
10
+ i = j;
11
+ }
12
+
13
+ long long total = 1;
14
+ for(int g : groups)
15
+ total = total * g % MOD;
16
+
17
+ int m = groups.size();
18
+ if(k > (int)groups.size()) {
19
+ vector<int> dp(k), newdp(k);
20
+ dp[0] = 1;
21
+ for(int idx = 0; idx < m; idx++) {
22
+ int len = groups[idx];
23
+ fill(newdp.begin(), newdp.end(), 0);
24
+
25
+ long long window = 0;
26
+ for(int j = 1; j < k; j++) {
27
+ window = (window + dp[j-1]) % MOD;
28
+ if(j - 1 - len >= 0)
29
+ window = (window - dp[j - 1 - len] + MOD) % MOD;
30
+ newdp[j] = window;
31
+ }
32
+ dp.swap(newdp);
33
+ }
34
+
35
+ long long invalid = 0;
36
+ for(int j = 1; j < k; j++)
37
+ invalid = (invalid + dp[j]) % MOD;
38
+
39
+ return int((total - invalid + MOD) % MOD);
40
+ }
41
+ // If minimum intended length <= #groups, we don't exclude anything
42
+ return int(total);
43
+ }
44
+ };
You can’t perform that action at this time.
0 commit comments