【剑指offer-C++】JZ75:字符流中第一个不重复的字符

【剑指offer-C++】JZ75:字符流中第一个不重复的字符

    • 题目描述
    • 解题思路

题目描述

描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 “go” 时,第一个只出现一次的字符是 “g” 。当从该字符流中读出前六个字符 “google" 时,第一个只出现一次的字符是"l"。

数据范围:字符串长度满足 1≤n≤1000 ,字符串中出现的字符一定在 ASCII 码内。

进阶:空间复杂度 O(n) ,时间复杂度 O(n) 。

后台会用以下方式调用 Insert 和 FirstAppearingOnce 函数。

string caseout = "";
1.读入测试用例字符串casein
2.如果对应语言有Init()函数的话,执行Init() 函数
3.循环遍历字符串里的每一个字符ch {
Insert(ch);
caseout += FirstAppearingOnce()
}
2. 输出caseout,进行比较。

返回值描述:如果当前字符流没有存在出现一次的字符,返回#字符。

输入:"google"
返回值:"ggg#ll"
输入:"abcdee"
返回值:"aaaaaa"

解题思路

字符流中第一个不重复的字符:最直观的想法是,使用map存储当前字符以及其出现的次数,然后再遍历一次字符串,找出只出现一次的字符并返回,若没有则返回#,两次遍历字符串可以保证字符是按照先后顺序出现的。该题将插入字符和查找第一个只出现一次的字符这两者分开了,故遍历一次字符串即可。注意map可以直接map[键]=值的喔,这样可以简化运算!

// <字符,出现的次数>
unordered_map umap;
// 输入的字符串
string s;
//Insert one char from stringstream
void Insert(char ch) 
{
   // 插入字符
   s+=ch;
   // 字符出现的次数加一
   umap[ch]++;
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce() 
{
    for(int i=0;i

你可能感兴趣的:(剑指offer,c++,开发语言)