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

**

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

**
题目出处:https://www.acwing.com/problem/content/60/
在这里插入图片描述
先通过样例来了解一下题目的意思:
输入的字符串中的字符会一个一个进入,每进入一个字符,就要输出一次当前字符串只第一个出只出现一次的字符。若没有一个符合,就输出#

例如:
当前读入 g 输出 g
当前读入 go 输出 gg
当前读入 goo 输出 ggg
当前读入 goog 因为g和o都出现了两次 所以不存在 输出ggg#
当前读入 googl l满足 当前输出 ggg#l
当前读入 google l第一个满足 当前输出 ggg#ll

题目思路:
因为字符串的加入和弹出符合队列,所以用queue来处理字符串
用一个unordered_map来保存每个字符当前的出现次数,若该字符出现字数>=2,就将queue队首的所有符合出现次数>=2的字符全部弹出。直至queue空或其队首字符的出现次数<=1为止,总之就是一定会符合题目要求。

举一个样例进行模拟:
输入gglklkg
当前queue; 当前 map; 当前输出
g; <g,1>; g
gg->NULL; <g,2>; g#
l; <l,1> <g,2>; g#l
lk; <l,1><k,1><g,2>; g#ll
lkl-> kl; <l,2><k,1><g,2>; g#llk
klk->NULL; <l,2><k,2><g,2>; g#llk#
g->NULL; <l,2><k,2><g,3>; g#llk##

AC代码如下:

class Solution{
public:
    queue<char>str;
    map<char,int>hash_map;
    void insert(char ch){
        str.push(ch);
        hash_map[ch]++;
        while(!str.empty()&&hash_map[str.front()]>=2)str.pop();
    }
    char firstAppearingOnce(){
        if(str.empty())return '#';
        return str.front();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值