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

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

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

相关推荐

02-18 21:55
门头沟学院 Java
拍打星:谁说的,焦虑只是一种心理状态,啥都不干也可以焦虑,不如说很多人就是因为啥都不干才导致焦虑感加重
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务