[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
posted @   CNoodle  阅读(222)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示