JZ54 字符流中第一个不重复的字符*
题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
思路
这道题需要考虑两个点:
(1) 关于重复字符的问题
(2) 关于读取当前字符流中第一个出现不重复的字符的问题
自己总结了一下关于重复的解题思路:
一般可以有两种方法:
- 利用set这个容器的特点,有一个内置函数count(如果找到就可以,可以用set)
- 利用map,key就是字符,value放字符的个数(如果需要保存起来就用这个)
上面第二个问题,一开始我想到的就是创建一个变量保存第一个不重复的字符,但是有个问题,万一接下来又遇到了这个字符,怎么去找当前第一个不重复的呢?
我想到了一个方法,可以利用队列来保存这些字符
具体的思路:
insert时:
- 将字符流的字符及各自出现的次数放入map中
- 同时,将字符全部存进队列
取第一个非重复的数:
从地队列中进行取数,取的时候从map中看下它的个数,如果是一个,那就取它;如果不是一个,那就从队列中丢掉;如果队列空了,那就说明没有不重复的字符,返回#
注:这里我一开始不知道怎么在两个函数之间共用容器map和queue,看了下讨论区发现,可以通过在函数外部定义公共public变量
代码
class Solution
{
public:
map<char,int> data;
queue<char> help;
//Insert one char from stringstream
void Insert(char ch)
{
if(data.count(ch)==0)
data.insert(make_pair(ch,1));
else
data[ch]++;
help.push(ch);
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce()
{
while(!help.empty())
{
if(data[help.front()]==1)
return help.front();
else
help.pop();
}
if(help.empty())
return '#';
}
};