一、题目
1、题目描述
给你一个字符串 S,找出所有长度为 K 且不含重复字符的子串,请你返回全部满足要求的子串的 数目。
示例 1:
输入:S = “havefunonleetcode”, K = 5
输出:6
解释:
这里有 6 个满足题意的子串,分别是:‘havef’,‘avefu’,‘vefun’,‘efuno’,‘etcod’,‘tcode’。
示例 2:
输入:S = “home”, K = 5
输出:0
解释:
注意:K 可能会大于 S 的长度。在这种情况下,就无法找到任何长度为 K 的子串。
2、基础框架
- C++版本给出的基础框架如下:
3、原题链接
https://leetcode.cn/problems/find-k-length-substrings-with-no-repeated-characters/文章来源:https://www.toymoban.com/news/detail-473792.html
二、解题报告
1、思路分析
(
1
)
(1)
(1)使用滑动窗口,创建unordered_set集合,右指针移动时,判断集合中是否存在当前右指针所指元素,如果存在,则滑动左指针直到不存在。
(
2
)
(2)
(2)否则,将当前右指针所指元素加入集合,如果滑动窗口长度为目标长度,则将该滑动窗口内的字符串加入结果集,同时将左指针右移一位。文章来源地址https://www.toymoban.com/news/detail-473792.html
2、时间复杂度
3、代码详解
class Solution {
public:
int numKLenSubstrNoRepeats(string s, int k) {
unordered_set<char> vis;
vector<string> re;
int l = 0;
int r = 0;
int m = 0;
while (r < s.size()) {
while (vis.find(s[r]) != vis.end()) {
vis.erase(s[l]);
m--;
l++;
}
vis.insert(s[r]);
m++;
if (m == k) {
re.push_back(s.substr(l, r - l + 1));
vis.erase(s[l]);
l++;
m--;
}
r++;
}
return re.size();
}
};
三、本题小知识
到了这里,关于【滑动窗口】1100. 长度为 K 的无重复字符子串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!