For each substring, we want to check if any character appears at least k times. Since the string is not too long (≤ 3000), we can use a sliding window approach: for every possible substring, count the frequency of each character and check if any count reaches k.
classSolution {
publicintcountSubstrings(String s, int k) {
int n = s.length(), ans = 0;
for (int i = 0; i < n; ++i) {
int[] cnt =newint[26];
for (int j = i; j < n; ++j) {
cnt[s.charAt(j) -'a']++;
for (int v : cnt) {
if (v >= k) {
ans++;
break;
}
}
}
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution {
funcountSubstrings(s: String, k: Int): Int {
val n = s.length
var ans = 0for (i in0 until n) {
val cnt = IntArray(26)
for (j in i until n) {
cnt[s[j] - 'a']++if (cnt.any { it>= k }) {
ans++ }
}
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution:
defcountSubstrings(self, s: str, k: int) -> int:
n = len(s)
ans =0for i in range(n):
cnt = [0] *26for j in range(i, n):
cnt[ord(s[j]) - ord('a')] +=1if max(cnt) >= k:
ans +=1return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
impl Solution {
pubfncount_substrings(s: String, k: i32) -> i32 {
let n = s.len();
let s = s.as_bytes();
letmut ans =0;
for i in0..n {
letmut cnt =vec![0; 26];
for j in i..n {
cnt[(s[j] -b'a') asusize] +=1;
if*cnt.iter().max().unwrap() >= k {
ans +=1;
}
}
}
ans
}
}