问题描述:
请实现一个函数用来找出字符流中第一个只出现一次的字符。
例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是’g’。当从该字符流中读出前六个字符”google”时,第一个只出现一次的字符是’l’。如果当前字符流没有存在出现一次的字符,返回#字符。
样例
输入:“google”
输出:“ggg#ll”
解释:每当字符流读入一个字符,就进行一次判断并输出当前的第一个只出现一次的字符。
巧妙地使用了队列,遇到第一个字母加入队列,下一个字母与队列的队首元素比较,如果相等,那么该队列队首元素删除,否则就加入到队列中,这样如果最后不为空的话,只要最后返回该队列队首元素即可。
class Solution{
public:
unordered_map<char,int> count;
queue<char> q;
//Insert one char from stringstream
void insert(char ch){
if(++count[ch]>1)
{
while(q.size()&&count[q.front()]>1) q.pop();
}
else q.push(ch);
}
//return the first appearence once char in current stringstream
char firstAppearingOnce(){
if(q.empty()) return '#';
return q.front();
}
};
用数组模拟的单调队列
class Solution{
public:
//Insert one char from stringstream
unordered_map<char,int> hash;
int hh=0,tt=-1;
char q[1000010];
void insert(char ch){
if(++hash[ch] >1)
{
while(hh<=tt && hash[q[hh]]>1) hh++;
}
else q[++tt]=ch;
}
//return the first appearence once char in current stringstream
char firstAppearingOnce(){
if(hh>tt) return '#';
else return q[hh];
}
};