周四

题目描述:

给定一个字符串 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;
    }
};
posted @ 2023-05-18 15:46  菜鸟de博客  阅读(30)  评论(0)    收藏  举报