题目描述:编写一个高效函数,找到字符串中首个非重复字符。如"total"首个非重复字符为'o',"teeter"为'r'。(时间复杂度最好为O(N))
思路:字符串仅限于使用ASCII码,可以用一数组来存放各个字符出现的次数,然后按字符串顺序找出首个次数为1的字符,并打印出来。
时间复杂度:遍历字符串O(N),找出首个次数为1 的字符最坏情况O(N),故总的时间复杂度O(N);
代码如下
View Code
1 #include<stdio.h> 2 //找字符串中首个非重复字符,如"total"首个非重复字符为'o',"teeter"为'r'。 3 void firstNonRepeated(char *str) 4 { 5 if (NULL == str) 6 { 7 return; 8 } 9 int asc[256] = {0}; 10 char *p = str; 11 while (*p != '\0') 12 { 13 asc[*p]++; 14 p++; 15 } 16 17 p = str; 18 while (*p != '\0') 19 { 20 if (asc[*p] == 1) 21 { 22 printf("%c\n", *p); 23 break; 24 } 25 p++; 26 27 } 28 29 } 30 31 int main() 32 { 33 char str1[] ="total"; 34 char str2[] ="teeter"; 35 firstNonRepeated(str1); 36 firstNonRepeated(str2); 37 return 0; 38 }
还有别的方法使用hashtable,不过感觉比较麻烦,而且我不太会用。。。但是使用hashtable可以优化空间复杂度。