C++ 使用哈希c+查找具有k个不同/唯一字符的最长子字符串+;

C++ 使用哈希c+查找具有k个不同/唯一字符的最长子字符串+;,c++,string,algorithm,hashtable,C++,String,Algorithm,Hashtable,我遇到了用k个唯一字符查找最长子字符串的问题。例如,给定以下str=abcbbbddcc,结果应为: k=2=>bcbbb k=3=>bcbbbddcc 为此,我使用哈希表创建了一个函数。哈希表将充当搜索窗口。只要当前窗口中有超过k个唯一字符,我就会通过将窗口的当前“开始”移到右侧来缩小它。否则,我只会扩展窗口的大小。不幸的是,这似乎是我的代码上的一个bug,但我仍然无法找到它。有人能帮我找到问题吗?my函数的输出是子字符串的开始索引及其长度,即子字符串(开始,开始+maxSize)。我发现

我遇到了用k个唯一字符查找最长子字符串的问题。例如,给定以下
str=abcbbbddcc
,结果应为:

  • k=2=>bcbbb
  • k=3=>bcbbbddcc
为此,我使用哈希表创建了一个函数。哈希表将充当搜索窗口。只要当前窗口中有超过k个唯一字符,我就会通过将窗口的当前“开始”移到右侧来缩小它。否则,我只会扩展窗口的大小。不幸的是,这似乎是我的代码上的一个bug,但我仍然无法找到它。有人能帮我找到问题吗?my函数的输出是子字符串的开始索引及其长度,即
子字符串(开始,开始+maxSize)。我发现了一些相关的帖子,但是仍然没有使用基于哈希表的C++解决方案。
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>

typedef std::vector<int> vector;
typedef std::string string;
typedef std::unordered_map<char, int> unordered_map;
typedef unordered_map::iterator map_iter;

vector longestSubstring(const string & str, int k){

    if(str.length() == 0 || k < 0){
        return {0};
    }

    int size = str.length();
    int start = 0;
    unordered_map map;
    int maxSize = 0;
    int count = 0;
    char c;

    for(int i = 0; i < size; i++){
        c = str[i];

        if(map.find(c)!=map.end()){
            map[c]++;
        }
        else{
            map.insert({c, 1});
        }

        while(map.size()>k){
            c = str[start];
            count = map[c];
            if(count>1){
                map[c]--;
            } 
            else{
                map.erase(c);
            }
            start++;
        }

        maxSize = std::max(maxSize, i-start+1);
    }

    return {start, maxSize};
}
#包括
#包括
#包括
#包括
typedef std::向量;
typedef std::string字符串;
typedef std::无序映射无序映射;
typedef无序映射::迭代器映射;
向量longestSubstring(常量字符串和str,int k){
如果(str.length()==0 | | k<0){
返回{0};
}
int size=str.length();
int start=0;
无序地图;
int maxSize=0;
整数计数=0;
字符c;
对于(int i=0;ik){
c=str[start];
计数=映射[c];
如果(计数>1){
地图[c]——;
} 
否则{
地图删除(c);
}
启动++;
}
maxSize=std::max(maxSize,i-start+1);
}
返回{start,maxSize};
}

maxSize=std::max之前(maxSize,i-start+1)
您必须确保映射大小正好为
k
-您永远无法达到
k
,但当前代码会立即更新
maxSize

还要记住自己的
max
code中的
start

    if (map.size() == k) 
        if (i - start + 1 > maxSize) {
            maxSize = i - start + 1;
            astart = start;
        }
...
return {astart, maxSize};

请不要创建常见类型的别名,特别是如果你把别名命名为与标准C++容器模板相同的话。阅读您的代码的人可能会被类型
无序图
向量
弄糊涂。如果您想使用类型别名,那么请使用反映type.MBo用法的名称,非常感谢您的解释并花时间查看我的代码。我几乎什么都明白了。只有一个问题,为什么我们需要新变量
astart
?@Tin,因为您可以移动
start++内部while循环和松开最佳开始位置代码中还有其他问题吗?我尝试了以下输入参数的修改
string str=“aabacbebebe”;int k=3,结果是
aabacb
,而不是
cbebebe
??我的检查显示maxsize=7,start=4(我用答案中的代码替换了前面提到的字符串)MBo,你介意把整个代码/解决方案都放进去吗?