题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
code
AC代码
- 使用了map和vector
- 使用了vector查找函数find和删除函数erase(利用迭代器)
class Solution
{
public:
map<char,int> mp;
vector<char> ans;//存储仅出现一次的字符序列,按出现顺序排列
void Insert(char ch)
{
if(mp[ch]==0){
mp[ch]=1;
ans.push_back(ch);
}
else {
mp[ch]++;
//从vector中移除ch
vector<char>::iterator iter = find(ans.begin(),ans.end(),ch);
if(iter!=ans.end()){
ans.erase(iter);
}
}
}
char FirstAppearingOnce()
{
if(ans.empty())
return '#';
else return ans[0];
}
};
通过40%
class Solution
{
public:
//Insert one char from stringstream
map<char,int> mp;
char ans;//存字符流中第一个只出现一次的字符
bool hasFirstAppearingOnce=false;
void Insert(char ch)
{
if(mp[ch]==0){
mp[ch]=1;
if(!hasFirstAppearingOnce){
hasFirstAppearingOnce=1;
ans=ch;
}
}
else if(mp[ch]==1){
mp[ch]++;
if(hasFirstAppearingOnce&&ans==ch){
hasFirstAppearingOnce=0;
//此处有缺陷
}
}
else {
mp[ch]++;
}
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce()
{
if(hasFirstAppearingOnce==false)
return '#';
else return ans;
}
};
测试用例
输入:BabyBaby
输出:BBBBaby#
Solution s;
s.Insert('B');
cout << s.FirstAppearingOnce();
s.Insert('a');
cout << s.FirstAppearingOnce();
s.Insert('b');
cout << s.FirstAppearingOnce();
s.Insert('y');
cout << s.FirstAppearingOnce();
s.Insert('B');
cout << s.FirstAppearingOnce();
s.Insert('a');
cout << s.FirstAppearingOnce();
s.Insert('b');
cout << s.FirstAppearingOnce();
s.Insert('y');
cout << s.FirstAppearingOnce();