一、题目
请实现一个函数用来找出字符流中第一个只出现一次的字符。
例如,当从字符流中只读出前两个字符 go
时,第一个只出现一次的字符是 g
。
当从该字符流中读出前六个字符 google
时,第一个只出现一次的字符是 l
。
如果当前字符流没有存在出现一次的字符,返回 #
字符。
数据范围
字符流读入字符数量 [0,1000]。
样例
输入:"google"
输出:"ggg#ll"
解释:每当字符流读入一个字符,就进行一次判断并输出当前的第一个只出现一次的字符。
二、思路解析
首先需要一个哈希表记录字符出现的次数,其次需要一个队列,存放当前出现一次的字符;
由于队列的结构特点是先入先出,所以字符流结束后第一个出现一次的字符一定在队;
所以当字符流不断输入的过程中,需要不断更新队列,不断更新哈希表。
例如:输入g 哈希表:<g,1> 队头:g;
输入go 哈希表:<g,1><o,1> 队头:g;
输入goo 哈希表:<g,1><o,2> 队头:g;
输入goog 哈希表:<g,2><o,2> 队头元素不符合条件,弹出g,队列为空;
输入googl 哈希表:<g,2><o,2><l,1> 队头:l;
输入google 哈希表:<g,2><o,2><l,1><e,1>队头:l;
三、代码实现
class Solution{
public:
//定义哈希表和队列
unordered_map<char, int> count;
queue<char> q;
//Insert one char from stringstream
void insert(char ch){
//每输入一个字符 就更新哈希表和队列
if( ++count[ch] > 1)
//当新加一个字符 字符数量大于1的时候 判断当前队头是否大于1 如果大于1 队头不满足字符出现一次的条件 出队
while(q.size() && count[q.front()] > 1) q.pop();
else
//当新加一个字符 不大于1 入队
q.push(ch);
}
//return the first appearence once char in current stringstream
char firstAppearingOnce(){
if(q.size()) return q.front();
return '#';
}
};