题目:
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。
思路:
首先应当明确,字符流是指像流水一样的字符,一去不复返,意味着只能访问一次。
使用数组来标记各个字符对应的状态
- -1:表示出现0次
- -2:表示出现1次以上
- 0~n:表示出现1次时位置
然后再遍历一遍数组找到位置最小的即可。
class Solution
{
int s[256];//辅助数组
char c;
unsigned int index;//标识字符在字符流中的位置
public:
Solution()
{
memset(s, -1, 256*sizeof(int));//初始化数组中所有的元素都为-1,即每个字符只出现了一次
c = '#';//若没有不重复的字符,则返回#号
index = 0;//从下标为0的位置开始
}
void Insert(char ch)
{
if(s[ch] == -1)//如果字符值出现一次,则记下字符在字符流中的位置
s[ch] = index;
else if(s[ch] >= 0)//如果字符出现了一次以上,则将数组中的元素更新为-2
s[ch] = -2;
index++;//位置标识后移一位
c = '#';//若输入字符流为空,则返回#号
}
char FirstAppearingOnce()
{
unsigned int minIndex = index;//字符流的长度
for(int i = 0; i < 256; i++)//遍历辅助数组
{
if(s[i] >= 0 && s[i] <= minIndex)//如果字符对应数组中的值大于等于0或小于等于字符在字符流中的最小位置,则更新第一个不重复的字符和对应的位置
{
c = i;
minIndex = s[i];
}
}
return c;
}
};