We want to count all substrings of length k in s that have no repeated characters. A sliding window of size k with a set to track unique characters allows us to efficiently check each substring.
classSolution {
public:int numKLenSubstrNoRepeats(string s, int k) {
if (k > s.size()) return0;
unordered_map<char, int> cnt;
int ans =0, left =0;
for (int right =0; right < s.size(); ++right) {
cnt[s[right]]++;
if (right - left +1> k) {
if (--cnt[s[left]] ==0) cnt.erase(s[left]);
left++;
}
if (right - left +1== k && cnt.size() == k) ans++;
}
return ans;
}
};
funcnumKLenSubstrNoRepeats(sstring, kint) int {
ifk > len(s) {
return0 }
cnt:= make(map[byte]int)
ans, left:=0, 0forright:=0; right < len(s); right++ {
cnt[s[right]]++ifright-left+1 > k {
cnt[s[left]]--ifcnt[s[left]] ==0 {
delete(cnt, s[left])
}
left++ }
ifright-left+1==k&& len(cnt) ==k {
ans++ }
}
returnans}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution {
publicintnumKLenSubstrNoRepeats(String s, int k) {
if (k > s.length()) return 0;
Map<Character, Integer> cnt =new HashMap<>();
int ans = 0, left = 0;
for (int right = 0; right < s.length(); right++) {
cnt.put(s.charAt(right), cnt.getOrDefault(s.charAt(right), 0) + 1);
if (right - left + 1 > k) {
char c = s.charAt(left);
cnt.put(c, cnt.get(c) - 1);
if (cnt.get(c) == 0) cnt.remove(c);
left++;
}
if (right - left + 1 == k && cnt.size() == k) ans++;
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution {
funnumKLenSubstrNoRepeats(s: String, k: Int): Int {
if (k > s.length) return0val cnt = mutableMapOf<Char, Int>()
var ans = 0var left = 0for (right in s.indices) {
cnt[s[right]] = cnt.getOrDefault(s[right], 0) + 1if (right - left + 1 > k) {
val c = s[left]
cnt[c] = cnt[c]!! - 1if (cnt[c] ==0) cnt.remove(c)
left++ }
if (right - left + 1== k && cnt.size == k) ans++ }
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution:
defnumKLenSubstrNoRepeats(self, s: str, k: int) -> int:
if k > len(s):
return0 cnt = {}
ans = left =0for right, c in enumerate(s):
cnt[c] = cnt.get(c, 0) +1if right - left +1> k:
cnt[s[left]] -=1if cnt[s[left]] ==0:
del cnt[s[left]]
left +=1if right - left +1== k and len(cnt) == k:
ans +=1return ans
impl Solution {
pubfnnum_k_len_substr_no_repeats(s: String, k: i32) -> i32 {
let s = s.as_bytes();
let k = k asusize;
if k > s.len() { return0; }
use std::collections::HashMap;
letmut cnt = HashMap::new();
let (mut ans, mut left) = (0, 0);
for right in0..s.len() {
*cnt.entry(s[right]).or_insert(0) +=1;
if right +1- left > k {
let e = cnt.entry(s[left]).or_insert(0);
*e -=1;
if*e ==0 { cnt.remove(&s[left]); }
left +=1;
}
if right +1- left == k && cnt.len() == k {
ans +=1;
}
}
ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution {
numKLenSubstrNoRepeats(s: string, k: number):number {
if (k>s.length) return0;
constcnt: Record<string, number> = {};
letans=0, left=0;
for (letright=0; right<s.length; right++) {
cnt[s[right]] = (cnt[s[right]] ||0) +1;
if (right-left+1>k) {
cnt[s[left]]--;
if (cnt[s[left]] ===0) deletecnt[s[left]];
left++;
}
if (right-left+1===k&& Object.keys(cnt).length===k) ans++;
}
returnans;
}
}