多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【剑指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 };
复制代码

 

本文作者:OhOfCourse

本文链接:https://www.cnblogs.com/OhOfCourse/p/16963837.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(17)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起