**
字符流中第一个只出现一次的字符
**
题目出处: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();
}
};