題目:
請實現一個函數用來找出字符流中第一個只出現一次的字符。例如,當從字符流中只讀出前兩個字符”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;
}
};