剑指offer54_字符流中第一个不重复的字符_题解

字符流中第一个不重复的字符

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

返回值描述

如果当前字符流没有存在出现一次的字符,返回#字符。

分析

方案一:哈希+队列

算法流程:

  1. 初始化哈希表 \(dic\) 和队列 \(q\)
  2. \(Insert\) 操作中,如果 \(ch\) 是第一次出现,则添加到 \(q\) 中,然后在哈希表中记录 \(ch\);如果 \(ch\) 重复出现,就无需添加到 \(q\) 中,还是需要在哈希表中记录
  3. \(FirstAppearingOnce\) 操作中,直接判断 \(q\) 的头部是否第一次出现,如果为第一次出现,直接返回 \(ch\),如果重复出现,则弹出 \(q\) 的头部,继续判断下一个头部是否满足要求

代码

#include <unordered_map>
class Solution
{
public:
  //Insert one char from stringstream
    queue<char> q;
    unordered_map<char, int> dic;
    void Insert(char ch)
    {
         // 如果是第一次出现, 则添加到队列中
         if (dic.find(ch) == dic.end()) {
             q.push(ch);
         }
         // 不管是不是第一次出现,都进行计数
         ++dic[ch];
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
        while (!q.empty()) {
            char ch = q.front();
            // 拿出头部,如果是第一次出现,则返回
            if (dic[ch] == 1) {
                return ch;
            }
            // 不是第一次出现,则弹出,然后继续判断下一个头部
            else {
                q.pop();
            }
        }
        return '#';
    }
};
posted @ 2021-02-23 20:59  RiverCold  阅读(31)  评论(0编辑  收藏  举报