zoukankan      html  css  js  c++  java
  • 54、剑指offer--字符流中第一个不重复的字符

    题目描述
    请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 
    输出描述:
    如果当前字符流没有存在出现一次的字符,返回#字符。
     
    解题思路:采用哈希表来实现。用字符的ASCII嘛作为哈希表的键值,而把字符对应的位置作为哈希表的值。遍历所有字母,如果该字母出现1次,且该字符对应的位置<minIndex,更新minIndex
    其中-1表示未出现过,-2表示多次出现,0表示只出现一次
     1 class Solution
     2 {
     3 public:
     4     Solution():index(0)
     5     {
     6         for(int i=0;i<256;i++)
     7             occurence[i] = -1;
     8     }
     9   //Insert one char from stringstream
    10     void Insert(char ch)
    11     {
    12         if(occurence[ch] == -1)
    13             occurence[ch] = index;
    14         else if(occurence[ch] >= 0)
    15             occurence[ch] = -2;
    16         index++;
    17     }
    18   //return the first appearence once char in current stringstream
    19     char FirstAppearingOnce()
    20     {
    21         char ch = '';
    22         int minIndex = numeric_limits<int>::max();//返回编译器允许的int型数 最大值
    23         for(int i=0;i<256;i++)
    24         {
    25             if(occurence[i] >=0 && occurence[i] <minIndex)//minIndex表示在字符串中出现的位置
    26             {
    27                 ch = (char)i;
    28                 minIndex = occurence[i];//i存储的是字符串的acii码,数组occ[i]存储的是位置,多次就是-2,没出现就是-1
    29             }
    30         }
    31          if(ch == '')//如果当前字符流没有存在出现一次的字符,返回#字符。
    32             return '#';
    33         return ch;
    34     }
    35 private:
    36     int occurence[256];//其中数组下标i对应与ASCII码
    37     int index;//存储第一个只出现一次的字符的索引
    38  
    39 };
  • 相关阅读:
    安亦行
    [SCOI2010]连续攻击游戏 二分图匹配
    [USACO11JAN]Roads and Planes G
    CF796C Bank Hacking
    括号类问题总结 持续更新
    CF1216E Numerical Sequence Hard Version 数学
    POJ3613 Cow Relays 矩阵快速幂
    倍增法求lca(最近公共祖先)
    Codeforces C. Jzzhu and Cities(dijkstra最短路)
    Codeforces B. Mouse Hunt(强连通分解缩点)
  • 原文地址:https://www.cnblogs.com/qqky/p/7095180.html
Copyright © 2011-2022 走看看