題目:
查找一個字符串中第一個只出現兩次的字符。比如:“abcdefabcdefabc”中第一個只出現兩次爲‘d’,要求時間複雜度爲O(N),空間複雜度爲O(1)。
由於本體的特殊性,我們可以定義一個非常簡單的哈希表。。字符(char)是一個長度爲8的數據類型,因此總共有256中可能。於是我們創建一個長度爲256的數組,每個字母根據其ASC碼值作爲數組的下標對應數組的一個數字,而數組中存儲的是每個字符出現的次數。
第一次掃描時,在哈希表中更新一個字符出現的次數是O(1)。如果字符長度爲n,那麼第一次掃描時間複雜度爲O(n)。第二次掃描時,同樣O(1)能讀出一個字符出現的次數,所以時間複雜度仍是O(n)。同時,我們需要一個包含256字符的輔助數組,由於數組的大小是個常數。因此空間複雜度爲O(1)。
char FindFirstTwo(char *str)
{
int len = strlen(str);
int hashtables[256] = { 0 };
for (int i = 0; i < len; ++i)
{
hashtables[str[i]]++;
}
for (int i = 0; i < len; ++i)
{
if (hashtables[str[i]] == 2)
{
return str[i];
}
}
return NULL;
}
void TestFindFirstTwo()
{
char str[] = "abcdefabcdefabc";
char res = FindFirstTwo(str);
cout << res << endl;
}