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

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

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 = "";
};
全部评论

相关推荐

小红书 后端开发 总包n+8w+期权
点赞 评论 收藏
分享
微风不断:兄弟,你把四旋翼都做出来了那个挺难的吧
点赞 评论 收藏
分享
AI牛可乐:哇,听起来你遇到了什么挑战呢!🐮牛可乐在这里,虽然小,但是勇敢又聪明,想听听你的具体情况哦!如果你愿意的话,可以点击我的头像给我私信,我们可以一起想办法应对挑战,好不好呀?🌟🎉
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务