[LeetCode] 1100. Find K-Length Substrings With No Repeated Characters

Given a string s and an integer k, return the number of substrings in s of length k with no repeated characters.

Example 1:
Input: s = “havefunonleetcode”, k = 5
Output: 6
Explanation: There are 6 substrings they are: ‘havef’,’avefu’,’vefun’,’efuno’,’etcod’,’tcode’.

Example 2:
Input: s = “home”, k = 5
Output: 0
Explanation: Notice k can be larger than the length of s. In this case, it is not possible to find any substring.

Constraints:
1 <= s.length <= 104
s consists of lowercase English letters.
1 <= k <= 104

长度为 K 的无重复字符子串。

思路

滑动窗口。

复杂度

时间O(n)
空间O(n)

代码

滑动窗口模板实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public int numKLenSubstrNoRepeats(String s, int k) {
// corner case
int len = s.length();
if (len < k) {
return 0;
}

// normal case
int start = 0;
int end = 0;
int res = 0;
HashSet<Character> set = new HashSet<>();
while (end < len) {
while (set.contains(s.charAt(end))) {
set.remove(s.charAt(start));
start++;
}
set.add(s.charAt(end));
end++;
if (end - start == k) {
res++;
set.remove(s.charAt(start));
start++;
}
}
return res;
}
}

固定窗口模板实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
public int numKLenSubstrNoRepeats(String s, int k) {
int n = s.length();
// corner case
if (s.length() < k) {
return 0;
}

// normal case
int res = 0;
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < k; i++) {
char c = s.charAt(i);
map.put(c, map.getOrDefault(c, 0) + 1);
}
if (map.size() == k) {
res++;
}

for (int i = k; i < n; i++) {
char c1 = s.charAt(i);
char c2 = s.charAt(i - k);
map.put(c2, map.get(c2) - 1);
if (map.get(c2) == 0) {
map.remove(c2);
}
map.put(c1, map.getOrDefault(c1, 0) + 1);
if (map.size() == k) {
res++;
}
}
return res;
}
}
// sliding window with fixed size

[LeetCode] 1100. Find K-Length Substrings With No Repeated Characters
https://shurui91.github.io/posts/36462718.html
Author
Aaron Liu
Posted on
July 20, 2020
Licensed under