题目描述:
给定一个字符串 s 和一个整数 k,你需要找到所有长度为 k 且只包含唯一字符的子串。
设计思路:
首先,定义一个字符串集合 ans
,用于存储结果。然后,从下标0开始遍历字符串s,利用 unordered_set
数据结构存储当前子串中出现的字符,并记录当前子串长度。当当前子串长度超过k时,将其首位字符从 unordered_set
中删除,并将子串起始位置加1。如果当前子串长度等于k,则将该子串添加到结果集合 ans
中。
程序流程图:
开始
|
获取字符串s和整数k
|
初始化ans和unordered_set
|
循环遍历s,每次增加一个字符
| |
| 如果unordered_set中已存在该字符,说明不符合条件,从首位删除字符并修改子串起始位置
| 否则,将字符加入unordered_set中
| |
| 如果unordered_set大小正好等于k,将子串添加到结果集合ans中
|
返回ans
结束
代码实现:
class Solution {
public:
vector<string> distinctSubstring(string s, int k) {
unordered_set<char> charSet;
vector<string> ans;
int start = 0;
for (int i = 0; i < s.size(); i++) {
if (charSet.count(s[i]) > 0) {
while (charSet.count(s[i]) > 0) {
charSet.erase(s[start]);
start++;
}
}
charSet.insert(s[i]);
if (charSet.size() == k) {
ans.push_back(s.substr(start, k));
charSet.erase(s[start]);
start++;
}
}
return ans;
}
};
标签:子串,周四,set,charSet,start,ans,unordered
From: https://www.cnblogs.com/zeyangshuaige/p/17412187.html