Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 25e1524

Browse files
feat: add solutions to lc problem: No.2953 (#2058)
No.2953.Count Complete Substrings
1 parent f2a411a commit 25e1524

File tree

7 files changed

+734
-3
lines changed

7 files changed

+734
-3
lines changed

‎solution/2900-2999/2953.Count Complete Substrings/README.md‎

Lines changed: 247 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,27 +58,271 @@
5858
<!-- 这里可写当前语言的特殊实现逻辑 -->
5959

6060
```python
61-
61+
class Solution:
62+
def countCompleteSubstrings(self, word: str, k: int) -> int:
63+
def f(s: str) -> int:
64+
m = len(s)
65+
ans = 0
66+
for i in range(1, 27):
67+
l = i * k
68+
if l > m:
69+
break
70+
cnt = Counter(s[:l])
71+
freq = Counter(cnt.values())
72+
ans += freq[k] == i
73+
for j in range(l, m):
74+
freq[cnt[s[j]]] -= 1
75+
cnt[s[j]] += 1
76+
freq[cnt[s[j]]] += 1
77+
78+
freq[cnt[s[j - l]]] -= 1
79+
cnt[s[j - l]] -= 1
80+
freq[cnt[s[j - l]]] += 1
81+
82+
ans += freq[k] == i
83+
return ans
84+
85+
n = len(word)
86+
ans = i = 0
87+
while i < n:
88+
j = i + 1
89+
while j < n and abs(ord(word[j]) - ord(word[j - 1])) <= 2:
90+
j += 1
91+
ans += f(word[i:j])
92+
i = j
93+
return ans
6294
```
6395

6496
### **Java**
6597

6698
<!-- 这里可写当前语言的特殊实现逻辑 -->
6799

68100
```java
69-
101+
class Solution {
102+
public int countCompleteSubstrings(String word, int k) {
103+
int n = word.length();
104+
int ans = 0;
105+
for (int i = 0; i < n;) {
106+
int j = i + 1;
107+
while (j < n && Math.abs(word.charAt(j) - word.charAt(j - 1)) <= 2) {
108+
++j;
109+
}
110+
ans += f(word.substring(i, j), k);
111+
i = j;
112+
}
113+
return ans;
114+
}
115+
116+
private int f(String s, int k) {
117+
int m = s.length();
118+
int ans = 0;
119+
for (int i = 1; i <= 26 && i * k <= m; ++i) {
120+
int l = i * k;
121+
int[] cnt = new int[26];
122+
for (int j = 0; j < l; ++j) {
123+
++cnt[s.charAt(j) - 'a'];
124+
}
125+
Map<Integer, Integer> freq = new HashMap<>();
126+
for (int x : cnt) {
127+
if (x > 0) {
128+
freq.merge(x, 1, Integer::sum);
129+
}
130+
}
131+
if (freq.getOrDefault(k, 0) == i) {
132+
++ans;
133+
}
134+
for (int j = l; j < m; ++j) {
135+
int a = s.charAt(j) - 'a';
136+
int b = s.charAt(j - l) - 'a';
137+
freq.merge(cnt[a], -1, Integer::sum);
138+
++cnt[a];
139+
freq.merge(cnt[a], 1, Integer::sum);
140+
141+
freq.merge(cnt[b], -1, Integer::sum);
142+
--cnt[b];
143+
freq.merge(cnt[b], 1, Integer::sum);
144+
if (freq.getOrDefault(k, 0) == i) {
145+
++ans;
146+
}
147+
}
148+
}
149+
return ans;
150+
}
151+
}
70152
```
71153

72154
### **C++**
73155

74156
```cpp
75-
157+
class Solution {
158+
public:
159+
int countCompleteSubstrings(string word, int k) {
160+
int n = word.length();
161+
int ans = 0;
162+
auto f = [&](string s) {
163+
int m = s.length();
164+
int ans = 0;
165+
for (int i = 1; i <= 26 && i * k <= m; ++i) {
166+
int l = i * k;
167+
int cnt[26]{};
168+
for (int j = 0; j < l; ++j) {
169+
++cnt[s[j] - 'a'];
170+
}
171+
unordered_map<int, int> freq;
172+
for (int x : cnt) {
173+
if (x > 0) {
174+
freq[x]++;
175+
}
176+
}
177+
if (freq[k] == i) {
178+
++ans;
179+
}
180+
for (int j = l; j < m; ++j) {
181+
int a = s[j] - 'a';
182+
int b = s[j - l] - 'a';
183+
freq[cnt[a]]--;
184+
cnt[a]++;
185+
freq[cnt[a]]++;
186+
187+
freq[cnt[b]]--;
188+
cnt[b]--;
189+
freq[cnt[b]]++;
190+
191+
if (freq[k] == i) {
192+
++ans;
193+
}
194+
}
195+
}
196+
return ans;
197+
};
198+
for (int i = 0; i < n;) {
199+
int j = i + 1;
200+
while (j < n && abs(word[j] - word[j - 1]) <= 2) {
201+
++j;
202+
}
203+
ans += f(word.substr(i, j - i));
204+
i = j;
205+
}
206+
return ans;
207+
}
208+
};
76209
```
77210

78211
### **Go**
79212

80213
```go
214+
func countCompleteSubstrings(word string, k int) (ans int) {
215+
n := len(word)
216+
f := func(s string) (ans int) {
217+
m := len(s)
218+
for i := 1; i <= 26 && i*k <= m; i++ {
219+
l := i * k
220+
cnt := [26]int{}
221+
for j := 0; j < l; j++ {
222+
cnt[int(s[j]-'a')]++
223+
}
224+
freq := map[int]int{}
225+
for _, x := range cnt {
226+
if x > 0 {
227+
freq[x]++
228+
}
229+
}
230+
if freq[k] == i {
231+
ans++
232+
}
233+
for j := l; j < m; j++ {
234+
a := int(s[j] - 'a')
235+
b := int(s[j-l] - 'a')
236+
freq[cnt[a]]--
237+
cnt[a]++
238+
freq[cnt[a]]++
239+
240+
freq[cnt[b]]--
241+
cnt[b]--
242+
freq[cnt[b]]++
243+
244+
if freq[k] == i {
245+
ans++
246+
}
247+
}
248+
}
249+
return
250+
}
251+
for i := 0; i < n; {
252+
j := i + 1
253+
for j < n && abs(int(word[j])-int(word[j-1])) <= 2 {
254+
j++
255+
}
256+
ans += f(word[i:j])
257+
i = j
258+
}
259+
return
260+
}
261+
262+
func abs(x int) int {
263+
if x < 0 {
264+
return -x
265+
}
266+
return x
267+
}
268+
```
81269

270+
### **TypeScript**
271+
272+
```ts
273+
function countCompleteSubstrings(word: string, k: number): number {
274+
const f = (s: string): number => {
275+
const m = s.length;
276+
let ans = 0;
277+
for (let i = 1; i <= 26 && i * k <= m; i++) {
278+
const l = i * k;
279+
const cnt: number[] = new Array(26).fill(0);
280+
for (let j = 0; j < l; j++) {
281+
cnt[s.charCodeAt(j) - 'a'.charCodeAt(0)]++;
282+
}
283+
const freq: { [key: number]: number } = {};
284+
for (const x of cnt) {
285+
if (x > 0) {
286+
freq[x] = (freq[x] || 0) + 1;
287+
}
288+
}
289+
if (freq[k] === i) {
290+
ans++;
291+
}
292+
293+
for (let j = l; j < m; j++) {
294+
const a = s.charCodeAt(j) - 'a'.charCodeAt(0);
295+
const b = s.charCodeAt(j - l) - 'a'.charCodeAt(0);
296+
297+
freq[cnt[a]]--;
298+
cnt[a]++;
299+
freq[cnt[a]] = (freq[cnt[a]] || 0) + 1;
300+
301+
freq[cnt[b]]--;
302+
cnt[b]--;
303+
freq[cnt[b]] = (freq[cnt[b]] || 0) + 1;
304+
305+
if (freq[k] === i) {
306+
ans++;
307+
}
308+
}
309+
}
310+
311+
return ans;
312+
};
313+
314+
let n = word.length;
315+
let ans = 0;
316+
for (let i = 0; i < n; ) {
317+
let j = i + 1;
318+
while (j < n && Math.abs(word.charCodeAt(j) - word.charCodeAt(j - 1)) <= 2) {
319+
j++;
320+
}
321+
ans += f(word.substring(i, j));
322+
i = j;
323+
}
324+
return ans;
325+
}
82326
```
83327

84328
### **...**

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /