在一個字符串中找到第一個只出現一次的字符。


題目:在一個字符串中找到第一個只出現一次的字符。如輸入abaccdeff,則輸出b。 分析:這道題是2006年google的一道筆試題。

      看到這道題時,最直觀的想法是從頭開始掃描這個字符串中的每個字符。當訪問到某字符時拿這個字符和后面的每個字符相比較,如果在后面沒有發現重復的字符,則該字符就是只出現一次的字符。如果字符串有n個字符,每個字符可能與后面的O(n)個字符相比較,因此這種思路時間復雜度是O(n2)。我們試着去找一個更快的方法。
      由於題目與字符出現的次數相關,我們是不是可以統計每個字符在該字符串中出現的次數?要達到這個目的,我們需要 一個數據容器來存放每個字符的出現次數。在這個數據容器中可以根據字符來查找它出現的次數,也就是說這個容器的作用是把一個字符映射成一個數字。在常用的 數據容器中,哈希表正是這個用途。
      哈希表是一種比較復雜的數據結構。由於比較復雜,STL中沒有實現哈希表,因此需要我們自己實現一個。但由於本題的特殊性,我們只需要一個非常簡單的哈希表就能滿足要求。由於字符(char)是一個長度為8的數據類型,因此總共有可能256 種可能。於是我們創建一個長度為256的數組,每個字母根據其ASCII碼值作為數組的下標對應數組的對應項,而數組中存儲的是每個字符對應的次數。這樣我們就創建了一個大小為256,以字符ASCII碼為鍵值的哈希表。(並不僅限於英文字符,所以這里要考慮256種可能)。
      我們第一遍掃描這個數組時,每碰到一個字符,在哈希表中找到對應的項並把出現的次數增加一次。這樣在進行第二次掃描時,就能直接從哈希表中得到每個字符出現的次數了。
參考代碼如下:

復制代碼
1 #include " stdio.h "
2 #include " string.h "
3 #include " stdlib.h "
4
5   char FirstNotRepeatingChar( char * pString)
6 {
7 // 輸入不合法
8 if ( ! pString)
9 return 0 ;
10
11 // 創建一個哈希表,並初始化
12 const int tableSize = 256 ;
13 int hashTable[tableSize];
14 for ( int i = 0 ; i < tableSize; i ++ )
15 hashTable[i] = 0 ;
16
17 // 確定字符串中每個字符出現的次數
18 char * pHashKey = pString;
19 while ( * (pHashKey) != ' \0 ' )
20 hashTable[ * (pHashKey ++ )] ++ ;
21
22 // 找到字符串中只出現一次的那個字符
23 pHashKey = pString;
24 while ( * pHashKey != ' \0 ' )
25 {
26 if (hashTable[ * pHashKey] == 1 )
27 return * pHashKey;
28 pHashKey ++ ;
29 }
30
31 // 如果這個字符串為空,或者字符串中的每個字符都至少出現兩次
32 return 0 ;
33 }
34
35 int main( void )
36 {
37 char str[ 1000 ];
38 printf( " 請輸入字符串: " );
39 gets(str);
40 if (FirstNotRepeatingChar(str) == 0 )
41 printf( " 輸入字符串中沒有找到第一個只出現一次的字符!\n " );
42 else
43 printf( " 輸入字符串中第一個只出現一次的字符為:%c\n " ,FirstNotRepeatingChar(str));
44 system( " pause " );
45 return 0 ;
46 }
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM