只允许遍历一遍字符串,找出字符串中第一个只出现一次的字符

来源:互联网 发布:网络飚车游戏 编辑:程序博客网 时间:2024/05/01 12:52

find the first unique character in  a string and you can just traverse this string only one time. if there is no such character, just return '#' and '#' will not appear in the string, else return the character you find.

for example: "aAbBABac", return 'b', and to "aBBa" return '#' as the final result. 

大家熟知的,以往我们找一个字符串中第一个只出现一次的字符的时候都允许重新遍历字符串,解决的思路是建立一个hash表,hash[256](256个字符),遍历一遍字符串,记录每个字符出现的次数,然后在重新遍历字符串,查看每个字符出现的次数,如果出现的次数为1,则打印出此字符,遍历停止。 然而,当只要求遍历一遍字符串的时候,只能得到每个字符出现的次数,不能得到字符原来在字符串中的排列顺序。只要能想到这一点,就能够解决问题了。再重新设定一个order数组来记录字符出现的次序,然后遍历次序数组,取出第几次出现的是哪个字符,然后在到hash表中找它出现的次数,如果次数为1,那么就找到符合要求的字符串了。给出代码:

[cpp] view plaincopy
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. char getUniqueCharacter(char *s) {  
  4.     int order[256] = {0};  
  5.     int counter[256] = {0};  
  6.     int i = 0;  
  7.     char temp;  
  8.     char *p = s;  
  9.     while(*p) {  
  10.         temp = *p;  
  11.         if(counter[temp] == 0) {  //找出第一次出现的字符 
  12.             order[i++] = temp;  
  13.         }  
  14.         counter[temp]++;  
  15.         p++;  
  16.     }  
  17.     int j;  
  18.     for(j = 0; j < 256; j++) {  
  19.         if(order[j] != 0) {  
  20.             if(counter[order[j]] == 1) {  
  21.                 temp = order[j];  
  22.                 break;  
  23.             }  
  24.         }  
  25.     }  
  26.     if(j >= 256) {  
  27.         return '#';  
  28.     } else {  
  29.         return temp;  
  30.     }  
  31. }  
  32.   
  33. void main() {  
  34.     char s[] = "aAbBABac";  
  35.     int n = strlen(s);  
  36.     char result = getUniqueCharacter(s);  
  37.     printf("%c\n", result);  
  38.     getchar();  
  39. }  

原创粉丝点击