题解 | #字符流中第一个不重复的字符#

字符流中第一个不重复的字符

http://www.nowcoder.com/practice/00de97733b8e4f97a3fb5c680ee10720

与之前的#第一个只出现一次的字符#十分相似的题。故采用了相同的思路来做。
维护一个私有的全局字符串str,每次Insert()都将输入的字符串添加到该str之后。
调用FirstAppearingOnce()时,遍历str,找到其中第一个只出现一次的字符。
其中找第一个只出现一次的字符的方法则使用了与上面给出的那题相同的方法,使用一个有128个元素的二维数组保存字符出现的信息,算是做了一种映射。将0-127中每一个字符都映射在了这个二维数组中。第一次遍历str,将str的信息储存在二维数组。然后遍历二维数组,找到第一个只出现一次的字符,返回。

这种做法时间复杂度为O(n),空间复杂度为O(1)。空间复杂度之所以是O(1),是因为这里虽然用到了辅助数组,但这个辅助数组的长度恒为128,而不随字符串长度的改变而改变。

class Solution
{
public:
  //Insert one char from stringstream
    void Insert(char ch) {
        str += ch;
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce() {
        if(str.empty()){
            return '#';
        }
        vector<int> temp {0, -1};
        vector<vector<int>> arr(128, temp);
        for(int i = 0;i < str.size();i++){
            arr.at(str[i]).at(0)++;
            if(arr.at(str[i]).at(1) == -1){
                arr.at(str[i]).at(1) = i;
            }
        }
        int min = 9999;
        for(int i = 0;i < arr.size();i++){
            if(arr.at(i).at(0) == 1 && arr.at(i).at(1) < min){
                min = arr.at(i).at(1);
            }
        }
        if(min == 9999){
            return '#';
        }
        return str[min];
    }
private:
    string str = "";
};
全部评论

相关推荐

杨柳哥:这不是普通人,那这个钱的是天才
点赞 评论 收藏
分享
听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务