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

时间:2016-03-01 07:24:19

标签: 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

1 个答案:

答案 0 :(得分:5)

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

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