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 '#'; } };