题解 | #字符流中第一个不重复的字符#
字符流中第一个不重复的字符
https://www.nowcoder.com/practice/00de97733b8e4f97a3fb5c680ee10720
#define ASCII_SIZE 128
#define NOT_APPEAR -1
#define REPEAT -2
class Solution
{
private:
// 存放当前输入字符位于字符流的索引
int index;
//记录每个ascii字符在字符流中的出现信息
// NOT_APPEAR (-1): 字符还没有出现过
// REPEAT (-2): 已经重复出现过了
// ELSE (>=0): 该字符在输入字符流中的索引
vector<int> ascii;
public:
// Init
Solution()
{
index = 0;
ascii = vector<int>(ASCII_SIZE);
// 全部填充 NOT_APPEAR
generate(ascii.begin(), ascii.end(),
[](){
return NOT_APPEAR;
});
}
//Insert one char from stringstream
void Insert(char ch) {
index++;
// NOT_APPEAR->记录索引->REPEAT
// 如果字符没有出现过,就记录出现位置的索引
if(ascii[ch] == NOT_APPEAR){
ascii[ch] = index;
}
// 若出现过,则标记出现过了
else if(ascii[ch] >= 0){
ascii[ch] = REPEAT;
}
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce() {
int _index = INT32_MAX; //存放最小的索引
int chCode = -1; //存放索引对应的char
for(int i = 0; i < ASCII_SIZE; i++){
// 1.只出现过一次 2.遍历后保证索引最小
if(ascii[i] >= 0 && ascii[i] < _index){
_index = ascii[i];
chCode = i; //3.同时记录索引最小处的字符
}
}
if(chCode == -1){
return '#';
}
return (char)chCode;
}
};
