一刷劍指offer(35)——第一個只出現一次的字符

題目:
在字符串中找到第一個只出現一次的字符。如輸入“abaccdeff”,輸出'b'。

最直觀的做法:從頭開始掃描這個字符串中每個字符。當訪問到某個字符時,拿這個字符和後面的每個字符相比較,如果在後面沒有發現重複的字符,則該字符爲只出現一次字符。若字符串有n個字符,那麼時間複雜度爲O(n^2)。

哈希表法:

由於題目與字符出現的次數相關,因此需要統計每個字符在字符串中出現的次數。

可以定義一個哈希表,key爲字符,value爲該字符出現的次數。

需要從頭開始掃描字符串兩次,第一次用於給哈希表賦值,第二次就可以直接得到出現的次數,這樣第一個出現一次的字符就是符合要求的輸出。

如何創建哈希表?

char是一個長度爲8的數據類型,因此有256種可能。於是可以創建一個長度爲256的數組,每個字母根據其ASCII碼值作爲數組的下標對應數組的一個數字,而數組存儲的是每個字符出現的次數。

時間複雜度=O(n),空間複雜度=O(1)。

char FirstNotRepeatingChar(char* pString)
{
    if(pString==NULL)
        return '\0';
    const int tablesize=256;
    unsigned int hashTable[tablesize];
    for(unsigned int i=0;i<tablesize;i++)
        hashTable[i]=0;
    char* pHashKey=pString;
    while(*pHashKey!='\0')
    {
        hashTable[*(pHashKey)]++;
    }
    pHashKey=pString;
    while(*pHashKey!='\0')
    {
        if(hashTable[*pHashKey]==1)
            return *pHashKey;
        pHashKey++;
    }
    return '\0';
}

總結:如果需要判斷多個字符是否在某個字符串裏出現過或者統計多個字符在某個字符串中出現的次數,可以考慮基於數組創建一個簡單的哈希表,這樣可以用很小的空間消耗換來時間效率的提升。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章