@@ -86,25 +86,254 @@ tags:
86
86
#### Python3
87
87
88
88
``` python
89
-
89
+ class Solution :
90
+ def possibleStringCount (self , word : str , k : int ) -> int :
91
+ mod = 10 ** 9 + 7
92
+ nums = []
93
+ ans = 1
94
+ cur = 0
95
+ for i, c in enumerate (word):
96
+ cur += 1
97
+ if i == len (word) - 1 or c != word[i + 1 ]:
98
+ if cur > 1 :
99
+ if k > 0 :
100
+ nums.append(cur - 1 )
101
+ ans = ans * cur % mod
102
+ cur = 0
103
+ k -= 1
104
+ if k < 1 :
105
+ return ans
106
+ m = len (nums)
107
+ f = [[0 ] * k for _ in range (m + 1 )]
108
+ f[0 ][0 ] = 1
109
+ for i, x in enumerate (nums, 1 ):
110
+ s = list (accumulate(f[i - 1 ], initial = 0 ))
111
+ for j in range (k):
112
+ f[i][j] = (s[j + 1 ] - s[j - min (x, j)] + mod) % mod
113
+ return (ans - sum (f[m][j] for j in range (k))) % mod
90
114
```
91
115
92
116
#### Java
93
117
94
118
``` java
95
-
119
+ class Solution {
120
+ public int possibleStringCount (String word , int k ) {
121
+ final int mod = (int ) 1e9 + 7 ;
122
+ List<Integer > nums = new ArrayList<> ();
123
+ long ans = 1 ;
124
+ int cur = 0 ;
125
+ int n = word. length();
126
+
127
+ for (int i = 0 ; i < n; i++ ) {
128
+ cur++ ;
129
+ if (i == n - 1 || word. charAt(i) != word. charAt(i + 1 )) {
130
+ if (cur > 1 ) {
131
+ if (k > 0 ) {
132
+ nums. add(cur - 1 );
133
+ }
134
+ ans = ans * cur % mod;
135
+ }
136
+ cur = 0 ;
137
+ k-- ;
138
+ }
139
+ }
140
+
141
+ if (k < 1 ) {
142
+ return (int ) ans;
143
+ }
144
+
145
+ int m = nums. size();
146
+ int [][] f = new int [m + 1 ][k];
147
+ f[0 ][0 ] = 1 ;
148
+
149
+ for (int i = 1 ; i <= m; i++ ) {
150
+ int x = nums. get(i - 1 );
151
+ long [] s = new long [k + 1 ];
152
+ for (int j = 0 ; j < k; j++ ) {
153
+ s[j + 1 ] = (s[j] + f[i - 1 ][j]) % mod;
154
+ }
155
+ for (int j = 0 ; j < k; j++ ) {
156
+ int l = Math . max(0 , j - x);
157
+ f[i][j] = (int ) ((s[j + 1 ] - s[l] + mod) % mod);
158
+ }
159
+ }
160
+
161
+ long sum = 0 ;
162
+ for (int j = 0 ; j < k; j++ ) {
163
+ sum = (sum + f[m][j]) % mod;
164
+ }
165
+
166
+ return (int ) ((ans - sum + mod) % mod);
167
+ }
168
+ }
96
169
```
97
170
98
171
#### C++
99
172
100
173
``` cpp
101
-
174
+ class Solution {
175
+ public:
176
+ int possibleStringCount(string word, int k) {
177
+ const int mod = 1e9 + 7;
178
+ vector<int > nums;
179
+ long long ans = 1;
180
+ int cur = 0;
181
+ int n = word.size();
182
+
183
+ for (int i = 0; i < n; ++i) {
184
+ cur++;
185
+ if (i == n - 1 || word[i] != word[i + 1]) {
186
+ if (cur > 1) {
187
+ if (k > 0) {
188
+ nums.push_back(cur - 1);
189
+ }
190
+ ans = ans * cur % mod;
191
+ }
192
+ cur = 0 ;
193
+ k--;
194
+ }
195
+ }
196
+
197
+ if (k < 1 ) {
198
+ return ans;
199
+ }
200
+
201
+ int m = nums.size();
202
+ vector<vector<int>> f(m + 1, vector<int>(k, 0));
203
+ f[0][0] = 1;
204
+
205
+ for (int i = 1; i <= m; ++i) {
206
+ int x = nums[i - 1];
207
+ vector<long long> s(k + 1, 0);
208
+ for (int j = 0; j < k; ++j) {
209
+ s[j + 1] = (s[j] + f[i - 1][j]) % mod;
210
+ }
211
+ for (int j = 0; j < k; ++j) {
212
+ int l = max(0, j - x);
213
+ f[i][j] = (s[j + 1] - s[l] + mod) % mod;
214
+ }
215
+ }
216
+
217
+ long long sum = 0;
218
+ for (int j = 0; j < k; ++j) {
219
+ sum = (sum + f[m][j]) % mod;
220
+ }
221
+
222
+ return (ans - sum + mod) % mod;
223
+ }
224
+ };
102
225
```
103
226
104
227
#### Go
105
228
106
229
``` go
230
+ func possibleStringCount (word string , k int ) int {
231
+ const mod = 1_000_000_007
232
+ nums := []int {}
233
+ ans := 1
234
+ cur := 0
235
+ n := len (word)
236
+
237
+ for i := 0 ; i < n; i++ {
238
+ cur++
239
+ if i == n-1 || word[i] != word[i+1 ] {
240
+ if cur > 1 {
241
+ if k > 0 {
242
+ nums = append (nums, cur-1 )
243
+ }
244
+ ans = ans * cur % mod
245
+ }
246
+ cur = 0
247
+ k--
248
+ }
249
+ }
250
+
251
+ if k < 1 {
252
+ return ans
253
+ }
254
+
255
+ m := len (nums)
256
+ f := make ([][]int , m+1 )
257
+ for i := range f {
258
+ f[i] = make ([]int , k)
259
+ }
260
+ f[0 ][0 ] = 1
261
+
262
+ for i := 1 ; i <= m; i++ {
263
+ x := nums[i-1 ]
264
+ s := make ([]int , k+1 )
265
+ for j := 0 ; j < k; j++ {
266
+ s[j+1 ] = (s[j] + f[i-1 ][j]) % mod
267
+ }
268
+ for j := 0 ; j < k; j++ {
269
+ l := j - x
270
+ if l < 0 {
271
+ l = 0
272
+ }
273
+ f[i][j] = (s[j+1 ] - s[l] + mod) % mod
274
+ }
275
+ }
276
+
277
+ sum := 0
278
+ for j := 0 ; j < k; j++ {
279
+ sum = (sum + f[m][j]) % mod
280
+ }
281
+
282
+ return (ans - sum + mod) % mod
283
+ }
284
+ ```
107
285
286
+ #### TypeScript
287
+
288
+ ``` ts
289
+ function possibleStringCount(word : string , k : number ): number {
290
+ const mod = 1_000_000_007 ;
291
+ const nums: number [] = [];
292
+ let ans = 1 ;
293
+ let cur = 0 ;
294
+ const n = word .length ;
295
+
296
+ for (let i = 0 ; i < n ; i ++ ) {
297
+ cur ++ ;
298
+ if (i === n - 1 || word [i ] !== word [i + 1 ]) {
299
+ if (cur > 1 ) {
300
+ if (k > 0 ) {
301
+ nums .push (cur - 1 );
302
+ }
303
+ ans = (ans * cur ) % mod ;
304
+ }
305
+ cur = 0 ;
306
+ k -- ;
307
+ }
308
+ }
309
+
310
+ if (k < 1 ) {
311
+ return ans ;
312
+ }
313
+
314
+ const m = nums .length ;
315
+ const f: number [][] = Array .from ({ length: m + 1 }, () => Array (k ).fill (0 ));
316
+ f [0 ][0 ] = 1 ;
317
+
318
+ for (let i = 1 ; i <= m ; i ++ ) {
319
+ const x = nums [i - 1 ];
320
+ const s: number [] = Array (k + 1 ).fill (0 );
321
+ for (let j = 0 ; j < k ; j ++ ) {
322
+ s [j + 1 ] = (s [j ] + f [i - 1 ][j ]) % mod ;
323
+ }
324
+ for (let j = 0 ; j < k ; j ++ ) {
325
+ const l = Math .max (0 , j - x );
326
+ f [i ][j ] = (s [j + 1 ] - s [l ] + mod ) % mod ;
327
+ }
328
+ }
329
+
330
+ let sum = 0 ;
331
+ for (let j = 0 ; j < k ; j ++ ) {
332
+ sum = (sum + f [m ][j ]) % mod ;
333
+ }
334
+
335
+ return (ans - sum + mod ) % mod ;
336
+ }
108
337
```
109
338
110
339
<!-- tabs:end -->
0 commit comments