剑指offer-54:字符流中第一个不重复的字符
先通过哈希表记录每个字符出现的次数,如果次数超过1,在队列(也可以用双指针维护)中只要队列非空且队列头字符次数也超过1,就把队列头的字符弹出,正常把1次出现的字符存入队列中,这样维护的队列如果为空则表明当前输入的字符流中都为重复字符,返回#;否则队列头的字符即为当前字符流的第一个不重复出现的字符。时间复杂度为O(n),具体代码如下:
class Solution
{
public:
//Insert one char from stringstream
unordered_map<char, int> count;
queue<int> q;
void Insert(char ch)
{
if(++count[ch] > 1){
while(q.size() && count[q.front()] > 1) q.pop(); //while保证可以重复将队列顶部不符合的字符弹出
//如go,第二个o输入不进去,再输入g,得到gog
//此时弹出g,剩下og,再弹出o,剩下g,再弹出g,因为g和o此时的count均为2,因此全弹出
}
else q.push(ch);
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce()
{
if(q.empty()) return '#';
else return q.front();
}
};