我试图编写一个函数来获取字符串的第一个非重复字符。对于所有情况,我都没有在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
答案 0 :(得分:5)
为什么要在每个循环中重复对strlen()的调用?这与字符串的长度呈线性关系,因此您的第一个循环实际上变为O(n ^ 2),完全没有任何理由。只需计算一次长度并存储它,或使用str [i]作为结束条件。
您还应该知道,如果您的编译器使用有符号字符,则任何大于127的字符值都将被视为负数(并用作负数,即超出界限,数组偏移量)。您可以通过显式地将字符值转换为unsigned char来避免这种情况。