【剑指offer】78.字符流中第一个不重复的字符
总目录:
1.问题描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 "go" 时,第一个只出现一次的字符是 "g" 。当从该字符流中读出前六个字符 “google" 时,第一个只出现一次的字符是"l"。
如果当前字符流没有存在仅出现一次的字符时,返回#字符。
数据范围:字符串长度满足 1≤n≤1000,字符串中出现的字符一定在 ASCII 码内。
 进阶:空间复杂度 O(n),时间复杂度 O(n) 
输入:"google",返回值:"ggg#ll"
输入:"abcdee",返回值:"aaaaaa"
2.问题分析
基本思想是,使用哈希来便利查找是否重复,使用队列来保证弹出顺序。
需要注意的是已经存入队列的元素可能已经过期,所以还需要统计存入队列中元素已经出现的次数。所以索要目标值时需要忽略队列中已经过期的元素。
3.代码实例
1 class Solution 2 { 3 public: 4 unordered_map<char, int> mp; 5 queue<char> q; 6 //Insert one char from stringstream 7 void Insert(char ch) { 8 //第一次出现加入队列中 9 if(mp.find(ch) == mp.end()) 10 q.push(ch); 11 //哈希表记录字符出现次数 12 mp[ch]++; 13 } 14 //return the first appearence once char in current stringstream 15 char FirstAppearingOnce() { 16 while(!q.empty()){ 17 //第一个不重复的字符 18 if(mp[q.front()] == 1) 19 return q.front(); 20 //弹出前面的已经重复的字符 21 else 22 q.pop(); 23 } 24 //都重复了 25 return '#'; 26 } 27 };
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号