跟着姚桑学算法-字符流中第一个只出现一次的字符

简介: 剑指offer算法

题. 字符流中第一个只出现一次的字符

请实现一个函数用来找出字符流中第一个只出现一次的字符。

例如,当从字符流中只读出前两个字符 go 时,第一个只出现一次的字符是 g

当从该字符流中读出前六个字符 google 时,第一个只出现一次的字符是 l

如果当前字符流没有存在出现一次的字符,返回 #字符。

数据范围
字符流读入字符数量 [0,1000]。

样例

输入:"google"

输出:"ggg#ll"

解释:每当字符流读入一个字符,就进行一次判断并输出当前的第一个只出现一次的字符。

【题解】--- 简单映射

利用chars 存储用set过滤出现过的字符次序;
cn 记录每个字符的出现次数,字符通过映射getI找到下标;
每次查询chars中字符的times,第一个出现1的字符返回即可。

复杂度分析:

时间复杂度为 O(n)。

C++代码实现:

// 常规思路
class Solution{
public:
    unordered_map<char,int> cnt;
    queue<char> q;
    //Insert one char from stringstream
    void insert(char ch){
        //最先出现的字符必然先插入的字符,故而我们可以考虑使用双指针,一个指针指向最开头元素,
        //另外一个指向当前插入的字符,可以采用队列的数据结构。
        //具体步骤如下,将当前插入的字符与队头字符cnt比较,如果当前字符已出现过,弹出队头,处理
        //下一个元素,时间复杂度为On
        if(++cnt[ch] > 1){
            while(q.size() && cnt[q.front()] > 1) q.pop();
        }
        else    q.push(ch);
    }
    //return the first appearence once char in current stringstream
    char firstAppearingOnce(){
        if(q.empty()) return '#';
        return q.front();
    }
};

// 简单映射法
class Solution{
public:
    static const int n=1010;

    char chars[n];
    int cn[11010];
    int now=0;
    set<char> setc;

    int getI(char c){
        return 10000+(int)c;
    }

    //Insert one char from stringstream
    void insert(char ch){
        //count times
        int idx=getI(ch);
        cn[idx]++;
        //次序
        if(setc.count(ch)==0){
            chars[now]=ch;
            now++;
        }
    }
    //return the first appearence once char in current stringstream
    char firstAppearingOnce(){
        for(int i=0;i<now;i++){
            char c=chars[i];
            int idx=getI(c);
            int times=cn[idx];
            if(times==1){
                return c;
            }
        }
        return '#';
    }
};
目录
相关文章
|
26天前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
45 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
54 1
|
6月前
|
算法
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
63 0
|
3月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
3月前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
6月前
|
算法 测试技术 编译器
【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
题目描述 题目 在字符矩阵中查找给定字符串的所有匹配项 给定一个M×N字符矩阵,以及一个字符串S,找到在矩阵中所有可能的连续字符组成的S的次数。所谓的连续字符,是指一个字符可以和位于其上下左右,左上左下,右上右下8个方向的字符组成字符串。用回溯法求解。
93 1
|
6月前
|
算法 C++
【优选算法】——滑动窗口——3. 无重复字符的最长子串
【优选算法】——滑动窗口——3. 无重复字符的最长子串
|
5月前
|
算法
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
55 0
|
6月前
|
人工智能 算法 测试技术
【字符串】【C++算法】828.统计子串中的唯一字符
【字符串】【C++算法】828.统计子串中的唯一字符