33、第一個只出現一次的字元
阿新 • • 發佈:2019-01-01
題目描述:
在字串中找出第一個只出現一次的字元。如輸入"abaccdeff",則輸出’b’。要求時間複雜度為O(n)。
解題思路:
為了解決這個問題,我們可以定義一個雜湊表(外部空間),其鍵值(Key)是字元,而值(Value)是該字元出現的次數。
同時我們還需要從頭開始掃描字串兩次:
1. 第一次掃描字串時,每掃描到一個字元就在雜湊表的對應項中把次數加1。(時間效率O(n))。
2. 第二次掃描時,每掃描到一個字元就能從雜湊表中得到該字元出現的次數。這樣第一個只出現一次的字元就是符合要求的輸出。(時間效率O(n))。
Demo:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
// 用雜湊表記錄下字元和次數
unordered_map<char, int> mp;
for (auto s : str)
mp[s]++;
int index = -1, sz = str.size();
for (int i = 0; i < sz; ++i)
{
auto tmp = mp.find(str[i]);
// 如果能找到該字元且出現一次則記錄下標退出
if ( tmp != mp. end() && tmp->second == 1)
{
index = i; break;
}
}
return index;
}
};
/*
int FirstNotRepeatingChar(string str)
{
vector<int> vec(256, 0);
int tmp;
for (auto s : str)
{
tmp = s;
vec[tmp]++;
}
int index = -1;
for (int i = 0; i < str.size(); ++i)
{
tmp = str[i];
if (vec[tmp] == 1)
{
index = i; break;
}
}
return index;
}
*/