C++:第一个非重复字符,使用 HashMap 的 O(n) 时间

标签 c++ string algorithm hash hashmap

我正在尝试编写一个函数来获取字符串的第一个非重复字符。对于如何在 O(n) 时间内完成所有情况,我还没有找到令人满意的答案。我当前的解决方案是:

char getFirstNonRepeated(char * str) {
    if (strlen(str) > 0) {
        int visitedArray[256] = {};    // Where 256 is the size of the alphabet
        for (int i = 0; i < strlen(str); i++) {
            visitedArray[str[i]] += 1;
        }

        for (int j = 0; j < 256; j++) {
            if (visitedArray[j] == 1) return j;
        }

    }
    return '\0';    // Either strlen == 0 or all characters are repeated
}

但是,只要 n < 256,该算法在最坏情况下运行时间为 O(n^2)。我读过,使用哈希表而不是数组来存储每个字符被访问的次数可以使算法在 O(n) 时间内一致运行,因为哈希表上的插入、删除和搜索在 O(n) 时间内运行(1次。我还没有找到解释如何正确执行此操作的问题。我没有太多在 C++ 中使用 HashMap 的经验,因此任何帮助将不胜感激。

最佳答案

为什么在每个循环中重复调用 strlen() ?这与字符串的长度成线性关系,因此您的第一个循环实际上变成了 O(n^2),根本没有任何理由。只需计算一次长度并存储它,或者使用 str[i] 作为结束条件。

您还应该注意,如果您的编译器使用有符号字符,则任何高于 127 的字符值都将被视为负数(并用作负数,即越界、数组偏移量)。您可以通过将字符值显式转换为 unsigned char 来避免这种情况。

关于C++:第一个非重复字符,使用 HashMap 的 O(n) 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35716956/

相关文章:

c++ - 关于模板继承

c++ - C/C++ 中的四元数库

python - 如何将字符串的各个部分提取为单独的字符串

C:如何将一串整数转换为实际的整数并将它们存储在数组中?

string - 如何在 Lua 中将一个字符串插入另一个字符串?

c++ - 如何解决LNK2001

c++ - Qt QWebsocket::open block 用户界面

php - 找到最接近拼写错误的城市名称的匹配项?

c++ - 在 C++ 中合并范围

algorithm - 图导航问题