1. 程式人生 > >劍指offer 面試題50:字元流中第一個只出現一次的字元

劍指offer 面試題50:字元流中第一個只出現一次的字元

題目描述:請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。

解法: 使用雜湊表occurance[256] ;  初始化occurance為-1,當遇到某個字元並且字元的occurance[ch]==-1時候,將其置為字元出現的位置index,當遇到某個字元並且字元的occurance[ch]>=0時候,說明其出現過,將occurance置為-2.最終只需要找出最小的occurance[i]即可,就是找到的第一個 只出現一次的字元

class Solution
{
public:
  //Insert one char from stringstream
    Solution():index(0)
    {
        for(int i=0;i<256;i++)
            occurance[i] = -1;
    }
    void Insert(char ch)
    {
         if(occurance[ch]== -1) occurance[ch] = index;
         else if(occurance[ch] >= 0 ) occurance[ch] =-2;
         index ++;
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
        char ch = '#';
        int min = INT_MAX;
        for(int i=0;i<256;++i)
        {
            if(min>occurance[i] && occurance[i] >=0)
            {
                ch = (char)i;
                min = occurance[i];
            }
        }
        return ch;
    }
private:
    int index;
    int occurance[256];
};