Skip to content

Commit f3b67a1

Browse files
authored
Create 3333. Find the Original Typed String II (#831)
2 parents 32a8fda + 922e747 commit f3b67a1

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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+
};

0 commit comments

Comments
 (0)