这道题使用了一个数组(哈希表)来保存每个字符出现的次数,使用了一个队列来保存输入的某些字符。
再处理输入和输出的过程中使用了“懒处理”的方式。其中,再输入的时候,如果遇到了之前出现过的字符,则不将其输入到队列中;而在输出的时候,遇到了出现过多次的字符,则都将它 pop 出队列,直到遇到第一个只出现了一次的字符。
使用这样的模型,就只会保存第一次出现的字符,所以队列的长度被控制在 256 个字符以内,可以认为内存开销是固定的 O(1)。并且输入字符的时候,时间复杂度为 O(1);而输出的时候,遍历的数字的数目只有出现重复字符的数目次(不超过 n),所以时间复杂度为 O(n),并且 n 不会超过 256。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { private: int times[256]; queue<char> chars; public: Solution(){ for(int i=0;i<256;i++) times[i]=0; } void Insert(char ch) { times[ch]++; if(times[ch]==1) chars.push(ch); } char FirstAppearingOnce() { while(!chars.empty()){ char t=chars.front(); if(times[t]==1) return t; else chars.pop(); } return '#'; }
};
|