- 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符
"go"
时,第一个只出现一次的字符是"g"
。当从该字符流中读出前六个字符“google"
时,第一个只出现一次的字符是"l"
。
如果当前字符流没有存在出现一次的字符,返回#字符。
很容易想到用map
来解决,如果是ASCII字符的话也可以用大小为128的数组(虽然1个字符占8位,但是ASCII中只有128个字符),字符的ASCII作为下标。
- 下面的思路来自牛客网用户txlstars的题解,使用数组作为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();
}
};