实现O(n)算法以确定字符串是否具有所有唯一字符?

时间:2014-08-06 02:32:13

标签: c++

这里我在C ++函数中实现了O(n ^ 2)算法,以确定字符串是否具有所有唯一字符。

bool IsUnique2(char *str)
{
    char instr[256];
    strcpy(instr,str);
    bool repeat = false;
    int i;
    for(i = 0; i<strlen(instr); i++)
    {
        int j;
        for(j=i+1; j<strlen(instr); j++)
        {
            if(instr[i]==instr[j])
            {repeat = true; break;}
        }
        if(repeat) break;
    }

    return !repeat;
}

此算法使用字符串的其他字符检查字符串的每个字符,以查找它们是否重复。 该方法具有O(n ^ 2)的时间复杂度,没有空间复杂性。有人可以建议时间复杂度O(n)的算法实现吗?

2 个答案:

答案 0 :(得分:5)

您可以保留已经看过的unordered_set<char>个字符,如果您所在的角色已经在该集中,则可以挽救。由于对集合的访问是按照常量时间分摊的,因此您的算法将在O(n)中运行。

您也可以使用bool数组代替集合,因为char通常具有非常小的范围(0-255)。

答案 1 :(得分:4)

以下时间复杂度为O(N)
它计算每个字符,并在字符不唯一时停止。

bool IsUnique(const char *str)
{
    char counts[256] = {0};

    for (; *str != '\0'; ++str) {
        const unsigned char c = *str;
        ++counts[c];
        if (counts[c] > 1) {
             return false;
        }
    }
    return true;
}