与之前的#第一个只出现一次的字符#十分相似的题。故采用了相同的思路来做。
维护一个私有的全局字符串str,每次Insert()都将输入的字符串添加到该str之后。
调用FirstAppearingOnce()时,遍历str,找到其中第一个只出现一次的字符。
其中找第一个只出现一次的字符的方法则使用了与上面给出的那题相同的方法,使用一个有128个元素的二维数组保存字符出现的信息,算是做了一种映射。将0-127中每一个字符都映射在了这个二维数组中。第一次遍历str,将str的信息储存在二维数组。然后遍历二维数组,找到第一个只出现一次的字符,返回。
这种做法时间复杂度为O(n),空间复杂度为O(1)。空间复杂度之所以是O(1),是因为这里虽然用到了辅助数组,但这个辅助数组的长度恒为128,而不随字符串长度的改变而改变。
class Solution
{
public:
//Insert one char from stringstream
void Insert(char ch) {
str += ch;
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce() {
if(str.empty()){
return '#';
}
vector<int> temp {0, -1};
vector<vector<int>> arr(128, temp);
for(int i = 0;i < str.size();i++){
arr.at(str[i]).at(0)++;
if(arr.at(str[i]).at(1) == -1){
arr.at(str[i]).at(1) = i;
}
}
int min = 9999;
for(int i = 0;i < arr.size();i++){
if(arr.at(i).at(0) == 1 && arr.at(i).at(1) < min){
min = arr.at(i).at(1);
}
}
if(min == 9999){
return '#';
}
return str[min];
}
private:
string str = "";
};