64. 字符流中第一个只出现一次的字符

 

 

 

使用 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();
    }

};

 

posted @ 2020-02-19 17:06  靖愁  阅读(241)  评论(0编辑  收藏  举报