50-02 字符流中第一个只出现一次的字符
题目
找出字符流中第一个只出现一次的字符。例如,当从字符流google中只读出前两个字符go时,第一个只出现一次的字符是g;当读完google时,第一个只出现一次的字符是l。
C++ 题解
此题的关键在于“字符流”。因此最好能够记住在哪个位置出现了哪个字符,从而可以完成每读到一个字符,就能动态更新到目前为止第一个出现一次的字符。
此题同样使用了长度为256的int数组作为哈希表,用字符的ascii码值作为表的键值,当字符仅出现了一次,就把字符的位置作为哈希表的值,如果没有出现则值为-1,如果出现的次数大于1则哈希表对应的值为-2。
当想要知道到某一位置时第一个出现一次的字符,可以通过扫描该哈希表,找到大于等于0的值中的最小值,该值所对应的字符就是当前状态第一个出现一次的字符。
class CharStatistics
{
public:
CharStatistics() : index(0)
{
for (int i = 0; i < 256; ++i)
occurrence[i] = -1;
}
void Insert(char ch)
{
if (occurrence[ch] == -1)
occurrence[ch] = index;
else if (occurrence[ch] >= 0)
occurrence[ch] = -2;
index++;
}
char FirstAppearingOnce()
{
char ch = '\0';
int minIndex = numeric_limits<int>::max();
for (int i = 0; i < 256; ++i)
{
if (occurrence[i] >= 0 && occurrence[i] < minIndex)
{
ch = (char)i;
minIndex = occurrence[i];
}
}
return ch;
}
private:
// occurrence[i]: A character with ASCII value i;
// occurrence[i] = -1: The character has not found;
// occurrence[i] = -2: The character has been found for mutlple times
// occurrence[i] >= 0: The character has been found only once
int occurrence[256];
int index;
};
python 题解
# -*- coding:utf-8 -*-
class Solution:
# 返回对应char
def __init__(self):
# 引入两个辅助空间:alist数组存储当前读入字符流的字符(按顺序)
# char_dict存储字符出现的次数,如果字符出现大于1次,为简单起见,统一记为2次。
self.alist=[]
self.char_dict={}
def FirstAppearingOnce(self):
# write code here
while len(self.alist)>0 and self.char_dict[self.alist[0]]>1:
self.alist.pop(0)
if len(self.alist)>0:
return self.alist[0]
return '#'
def Insert(self, char):
# write code here
if char not in self.char_dict.keys():
self.char_dict[char]=1
self.alist.append(char)
else:
self.char_dict[char]=2