Skip to content

Commit e8fc106

Browse files
authored
feat: add solutions to lc problem: No.3333 (doocs#4540)
No.3333.Find the Original Typed String II
1 parent 10461e4 commit e8fc106

File tree

7 files changed

+692
-6
lines changed

7 files changed

+692
-6
lines changed

solution/3300-3399/3333.Find the Original Typed String II/README.md

Lines changed: 232 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)