《劍指offer》——字符流中第一個不重複的字符

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

思路:
首先應當明確,字符流是指像流水一樣的字符,一去不復返,意味着只能訪問一次
使用數組來標記各個字符對應的狀態

  • -1:表示出現0次
  • -2:表示出現1次以上
  • 0~n:表示出現1次時位置

然後再遍歷一遍數組找到位置最小的即可。

class Solution
{
    int s[256];//輔助數組
    char c;
    unsigned int index;//標識字符在字符流中的位置
public:
    Solution()
    {
        memset(s, -1, 256*sizeof(int));//初始化數組中所有的元素都爲-1,即每個字符只出現了一次
        c = '#';//若沒有不重複的字符,則返回#號
        index = 0;//從下標爲0的位置開始
    }

    void Insert(char ch)
    {
        if(s[ch] == -1)//如果字符值出現一次,則記下字符在字符流中的位置
            s[ch] = index;
        else if(s[ch] >= 0)//如果字符出現了一次以上,則將數組中的元素更新爲-2
            s[ch] = -2;
        index++;//位置標識後移一位
        c = '#';//若輸入字符流爲空,則返回#號
    }

    char FirstAppearingOnce()
    {
        unsigned int minIndex = index;//字符流的長度
        for(int i = 0; i < 256; i++)//遍歷輔助數組
        {
            if(s[i] >= 0 && s[i] <= minIndex)//如果字符對應數組中的值大於等於0或小於等於字符在字符流中的最小位置,則更新第一個不重複的字符和對應的位置
            {
                c = i;
                minIndex = s[i];
            }
        }
        return c;
    }
};
發佈了82 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章