这里我在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)的算法实现吗?
答案 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;
}