题解 | #字符流中第一个不重复的字符#
字符流中第一个不重复的字符
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; } };