[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)
代码
滑动窗口模板实现
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;
}
}
固定窗口模板实现
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