使用 hash 映射 和队列,
字符流中出现一次的字符都会存在队列中,刚好可以利用队列的先进先出的特性。如果队列不为空,则返回队头元素,为空,则返回 ‘#’
将字符在hash的对应位置加一计数,然后检查这个元素的个数是否满足第一次出现,若满足则直接插入队列中,否则,检查队头元素是否是字符串流中的第一个字符,如果不是,则弹出,直到满足队列为空或者队头元素只出现了一次。
————————————————
原文链接:https://blog.csdn.net/wchzh2015/article/details/90342279
class Solution{ public: unordered_map<char,int>count; queue<char> q; //Insert one char from stringstream void insert(char ch){ //当新的字符已经重复,则不插入,而且将队首有可能重复的pop出来。goo,当新来第二个O, //此时队首不重复的,证明O永远不会输出,所以此时O不用插入,省一点空间。队列里只存一个O,pop的时候,count里O是两个, //所以O还是可以正常pop count[ch]++; //检查这个元素的个数是否满足第一次出现 if(count[ch] > 1) { /*检查队头元素是否是字符串流中的第一个字符,如果不是,则弹出, 直到满足队列为空或者队头元素只出现了一次。*/ while(q.size() && count[q.front()] > 1) q.pop();//队头元素g重复,将g弹出。如果再添加g,因为hash表中记录了g出现的次数,所以不会将g添加入队列 } else q.push(ch); } //return the first appearence once char in current stringstream char firstAppearingOnce(){ if(q.empty()) return '#'; return q.front(); } };