Skip to content

Commit 77b81ca

Browse files
committed
feat: add solutions to lc problem: No.2067
No.2067.Number of Equal Count Substrings
1 parent ad013ab commit 77b81ca

File tree

6 files changed

+469
-2
lines changed

6 files changed

+469
-2
lines changed

solution/2000-2099/2067.Number of Equal Count Substrings/README.md

+162-1
Original file line numberDiff line numberDiff line change
@@ -59,22 +59,183 @@ Therefore, no substrings in s are equal count substrings, so return 0</pre>
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

62+
前缀和统计每个位置各个字母出现的次数。然后根据 count 枚举子字符串左右端点,check 是否满足条件,是则 ans 加 1。
63+
64+
最后返回 ans。
65+
6266
<!-- tabs:start -->
6367

6468
### **Python3**
6569

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

6872
```python
69-
73+
class Solution:
74+
def equalCountSubstrings(self, s: str, count: int) -> int:
75+
n = len(s)
76+
if count > n:
77+
return 0
78+
counter = [[0] * 26 for _ in range(n + 1)]
79+
80+
def check(i, j):
81+
c1 = counter[i]
82+
c2 = counter[j + 1]
83+
for k in range(26):
84+
if c2[k] == 0 or c1[k] == c2[k]:
85+
continue
86+
if c2[k] - c1[k] != count:
87+
return False
88+
return True
89+
90+
ans = 0
91+
for i, c in enumerate(s):
92+
idx = ord(c) - ord('a')
93+
for j in range(26):
94+
counter[i + 1][j] = counter[i][j]
95+
counter[i + 1][idx] = counter[i][idx] + 1
96+
l = 0
97+
for _ in range(26):
98+
l += count
99+
j = i - l + 1
100+
if j < 0:
101+
break
102+
ans += check(j, i)
103+
return ans
70104
```
71105

72106
### **Java**
73107

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

76110
```java
111+
class Solution {
112+
public int equalCountSubstrings(String s, int count) {
113+
int n = s.length();
114+
if (count > n) {
115+
return 0;
116+
}
117+
int[][] counter = new int[n + 1][26];
118+
int ans = 0;
119+
for (int i = 0; i < n; ++i) {
120+
int idx = s.charAt(i) - 'a';
121+
for (int j = 0; j < 26; ++j) {
122+
counter[i + 1][j] = counter[i][j];
123+
}
124+
counter[i + 1][idx] = counter[i][idx] + 1;
125+
int l = 0;
126+
for (int k = 0; k < 26; ++k) {
127+
l += count;
128+
int j = i - l + 1;
129+
if (j < 0) {
130+
break;
131+
}
132+
ans += check(j, i, count, counter) ? 1 : 0;
133+
}
134+
}
135+
return ans;
136+
}
137+
138+
private boolean check(int i, int j, int count, int[][] counter) {
139+
int[] c1 = counter[i];
140+
int[] c2 = counter[j + 1];
141+
for (int k = 0; k < 26; ++k) {
142+
if (c2[k] == 0 || c1[k] == c2[k]) {
143+
continue;
144+
}
145+
if (c2[k] - c1[k] != count) {
146+
return false;
147+
}
148+
}
149+
return true;
150+
}
151+
}
152+
```
153+
154+
### **C++**
155+
156+
```cpp
157+
class Solution {
158+
public:
159+
int equalCountSubstrings(string s, int count) {
160+
int n = s.size();
161+
if (count > n) return 0;
162+
vector<vector<int>> counter(n + 1, vector<int>(26));
163+
int ans = 0;
164+
for (int i = 0; i < n; ++i)
165+
{
166+
int idx = s[i] - 'a';
167+
for (int j = 0; j < 26; ++j) counter[i + 1][j] = counter[i][j];
168+
counter[i + 1][idx] = counter[i][idx] + 1;
169+
int l = 0;
170+
for (int k = 0; k < 26; ++k)
171+
{
172+
l += count;
173+
int j = i - l + 1;
174+
if (j < 0) break;
175+
ans += check(j, i, count, counter);
176+
}
177+
}
178+
return ans;
179+
}
180+
181+
bool check(int i, int j, int count, vector<vector<int>>& counter) {
182+
auto& c1 = counter[i];
183+
auto& c2 = counter[j + 1];
184+
for (int k = 0; k < 26; ++k)
185+
{
186+
if (c2[k] == 0 || c1[k] == c2[k]) continue;
187+
if (c2[k] - c1[k] != count) return false;
188+
}
189+
return true;
190+
}
191+
};
192+
```
77193

194+
### **Go**
195+
196+
```go
197+
func equalCountSubstrings(s string, count int) int {
198+
n := len(s)
199+
if count > n {
200+
return 0
201+
}
202+
counter := make([][]int, n+1)
203+
for i := range counter {
204+
counter[i] = make([]int, 26)
205+
}
206+
ans := 0
207+
check := func(i, j int) bool {
208+
c1, c2 := counter[i], counter[j+1]
209+
for k := 0; k < 26; k++ {
210+
if c2[k] == 0 || c1[k] == c2[k] {
211+
continue
212+
}
213+
if c2[k]-c1[k] != count {
214+
return false
215+
}
216+
}
217+
return true
218+
}
219+
for i, c := range s {
220+
idx := c - 'a'
221+
for j := 0; j < 26; j++ {
222+
counter[i+1][j] = counter[i][j]
223+
}
224+
counter[i+1][idx] = counter[i][idx] + 1
225+
l := 0
226+
for k := 0; k < 26; k++ {
227+
l += count
228+
j := i - l + 1
229+
if j < 0 {
230+
break
231+
}
232+
if check(j, i) {
233+
ans++
234+
}
235+
}
236+
}
237+
return ans
238+
}
78239
```
79240

80241
### **...**

solution/2000-2099/2067.Number of Equal Count Substrings/README_EN.md

+158-1
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,170 @@ Therefore, no substrings in s are equal count substrings, so return 0</pre>
6060
### **Python3**
6161

6262
```python
63-
63+
class Solution:
64+
def equalCountSubstrings(self, s: str, count: int) -> int:
65+
n = len(s)
66+
if count > n:
67+
return 0
68+
counter = [[0] * 26 for _ in range(n + 1)]
69+
70+
def check(i, j):
71+
c1 = counter[i]
72+
c2 = counter[j + 1]
73+
for k in range(26):
74+
if c2[k] == 0 or c1[k] == c2[k]:
75+
continue
76+
if c2[k] - c1[k] != count:
77+
return False
78+
return True
79+
80+
ans = 0
81+
for i, c in enumerate(s):
82+
idx = ord(c) - ord('a')
83+
for j in range(26):
84+
counter[i + 1][j] = counter[i][j]
85+
counter[i + 1][idx] = counter[i][idx] + 1
86+
l = 0
87+
for _ in range(26):
88+
l += count
89+
j = i - l + 1
90+
if j < 0:
91+
break
92+
ans += check(j, i)
93+
return ans
6494
```
6595

6696
### **Java**
6797

6898
```java
99+
class Solution {
100+
public int equalCountSubstrings(String s, int count) {
101+
int n = s.length();
102+
if (count > n) {
103+
return 0;
104+
}
105+
int[][] counter = new int[n + 1][26];
106+
int ans = 0;
107+
for (int i = 0; i < n; ++i) {
108+
int idx = s.charAt(i) - 'a';
109+
for (int j = 0; j < 26; ++j) {
110+
counter[i + 1][j] = counter[i][j];
111+
}
112+
counter[i + 1][idx] = counter[i][idx] + 1;
113+
int l = 0;
114+
for (int k = 0; k < 26; ++k) {
115+
l += count;
116+
int j = i - l + 1;
117+
if (j < 0) {
118+
break;
119+
}
120+
ans += check(j, i, count, counter) ? 1 : 0;
121+
}
122+
}
123+
return ans;
124+
}
125+
126+
private boolean check(int i, int j, int count, int[][] counter) {
127+
int[] c1 = counter[i];
128+
int[] c2 = counter[j + 1];
129+
for (int k = 0; k < 26; ++k) {
130+
if (c2[k] == 0 || c1[k] == c2[k]) {
131+
continue;
132+
}
133+
if (c2[k] - c1[k] != count) {
134+
return false;
135+
}
136+
}
137+
return true;
138+
}
139+
}
140+
```
141+
142+
### **C++**
143+
144+
```cpp
145+
class Solution {
146+
public:
147+
int equalCountSubstrings(string s, int count) {
148+
int n = s.size();
149+
if (count > n) return 0;
150+
vector<vector<int>> counter(n + 1, vector<int>(26));
151+
int ans = 0;
152+
for (int i = 0; i < n; ++i)
153+
{
154+
int idx = s[i] - 'a';
155+
for (int j = 0; j < 26; ++j) counter[i + 1][j] = counter[i][j];
156+
counter[i + 1][idx] = counter[i][idx] + 1;
157+
int l = 0;
158+
for (int k = 0; k < 26; ++k)
159+
{
160+
l += count;
161+
int j = i - l + 1;
162+
if (j < 0) break;
163+
ans += check(j, i, count, counter);
164+
}
165+
}
166+
return ans;
167+
}
168+
169+
bool check(int i, int j, int count, vector<vector<int>>& counter) {
170+
auto& c1 = counter[i];
171+
auto& c2 = counter[j + 1];
172+
for (int k = 0; k < 26; ++k)
173+
{
174+
if (c2[k] == 0 || c1[k] == c2[k]) continue;
175+
if (c2[k] - c1[k] != count) return false;
176+
}
177+
return true;
178+
}
179+
};
180+
```
69181

182+
### **Go**
183+
184+
```go
185+
func equalCountSubstrings(s string, count int) int {
186+
n := len(s)
187+
if count > n {
188+
return 0
189+
}
190+
counter := make([][]int, n+1)
191+
for i := range counter {
192+
counter[i] = make([]int, 26)
193+
}
194+
ans := 0
195+
check := func(i, j int) bool {
196+
c1, c2 := counter[i], counter[j+1]
197+
for k := 0; k < 26; k++ {
198+
if c2[k] == 0 || c1[k] == c2[k] {
199+
continue
200+
}
201+
if c2[k]-c1[k] != count {
202+
return false
203+
}
204+
}
205+
return true
206+
}
207+
for i, c := range s {
208+
idx := c - 'a'
209+
for j := 0; j < 26; j++ {
210+
counter[i+1][j] = counter[i][j]
211+
}
212+
counter[i+1][idx] = counter[i][idx] + 1
213+
l := 0
214+
for k := 0; k < 26; k++ {
215+
l += count
216+
j := i - l + 1
217+
if j < 0 {
218+
break
219+
}
220+
if check(j, i) {
221+
ans++
222+
}
223+
}
224+
}
225+
return ans
226+
}
70227
```
71228

72229
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution {
2+
public:
3+
int equalCountSubstrings(string s, int count) {
4+
int n = s.size();
5+
if (count > n) return 0;
6+
vector<vector<int>> counter(n + 1, vector<int>(26));
7+
int ans = 0;
8+
for (int i = 0; i < n; ++i)
9+
{
10+
int idx = s[i] - 'a';
11+
for (int j = 0; j < 26; ++j) counter[i + 1][j] = counter[i][j];
12+
counter[i + 1][idx] = counter[i][idx] + 1;
13+
int l = 0;
14+
for (int k = 0; k < 26; ++k)
15+
{
16+
l += count;
17+
int j = i - l + 1;
18+
if (j < 0) break;
19+
ans += check(j, i, count, counter);
20+
}
21+
}
22+
return ans;
23+
}
24+
25+
bool check(int i, int j, int count, vector<vector<int>>& counter) {
26+
auto& c1 = counter[i];
27+
auto& c2 = counter[j + 1];
28+
for (int k = 0; k < 26; ++k)
29+
{
30+
if (c2[k] == 0 || c1[k] == c2[k]) continue;
31+
if (c2[k] - c1[k] != count) return false;
32+
}
33+
return true;
34+
}
35+
};

0 commit comments

Comments
 (0)