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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用hash c ++查找具有k个不同/唯一字符的最长子字符串相关的知识,希望对你有一定的参考价值。

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

  • k=2 => bcbbb
  • k=3 => bcbbbddcc

我使用哈希表为此目的创建了一个函数。哈希表将充当搜索窗口。每当当前窗口内有超过k个唯一字符时,我会通过向右移动窗口的当前“开始”来缩小它。否则,我只是扩大窗口的大小。不幸的是,它似乎是我的代码上的一个错误,但我仍然无法找到它。有人可以帮我找到问题吗?我的函数的输出是子串的起始索引及其长度,即substring(start, start+maxSize);。我找到了一些相关的帖子java-solpython-sol,但仍然没有使用哈希表的基于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};
}
答案

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

还要记住自己的start代码中的max

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

Ideone check

以上是关于使用hash c ++查找具有k个不同/唯一字符的最长子字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在PowerShell中使用运算符'-replace'来替换具有特殊字符的文本字符串并成功替换

优化或提出c++、c#代码使用omp查找所有相似的k个motifs

查找最多具有 k 个奇数元素的不同连续子数组的数量

一个汉字算一个字符吗

使用Unordered_map c ++的字符串中的第一个唯一字符

文本近似hash