查找一個字符串中第一個只出現兩次的字符。

題目:

查找一個字符串中第一個只出現兩次的字符。比如:“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;
}

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