Skip to content

Latest commit

 

History

History
62 lines (41 loc) · 1.89 KB

54.字符流中第一个不重复的字符.md

File metadata and controls

62 lines (41 loc) · 1.89 KB

54.字符流中第一个不重复的字符

题目描述

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

输出描述:

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

 

解题思路

很容易想到用map来解决,如果是ASCII字符的话也可以用大小为128的数组(虽然1个字符占8位,但是ASCII中只有128个字符),字符的ASCII作为下标。

时间复杂度O(1),空间复杂度O(n)

​ 1、用一个128大小的数组统计每个字符出现的次数

​ 2、用一个队列,如果第一次遇到ch字符,则插入队列;其他情况不在插入

​ 3、求解第一个出现的字符,判断队首元素是否只出现一次,如果是直接返回,否则删除继续第3步骤

 

代码

  • 思路一,使用数组作为ASCII哈希表,队列存储只出现一次的元素
class Solution
{
private:
    int hashMap[128] = {0};
    queue<char> onceChar;
public:
  //Insert one char from stringstream
    void Insert(char ch)
    {
         hashMap[ch - '\0']++;
        if(hashMap[ch - '\0']==1) onceChar.push(ch);
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
        while(!onceChar.empty() && hashMap[onceChar.front()-'\0']>1) 
            onceChar.pop();
        if(onceChar.empty()) return '#';
        else return onceChar.front();
    }

};