@@ -86,25 +86,254 @@ tags:
8686#### Python3
8787
8888``` 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
90114```
91115
92116#### Java
93117
94118``` 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+ }
96169```
97170
98171#### C++
99172
100173``` 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+ };
102225```
103226
104227#### Go
105228
106229``` 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+ ```
107285
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+ }
108337```
109338
110339<!-- tabs:end -->
0 commit comments