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