50-02 字符流中第一个不重复的字符( 时间空间效率的平衡)
题目描述:
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。
测试用例:
1)功能测试(读入一个字符,读入多个字符,读入的所有字符都是唯一的,读入的所有字符都是重复出现的)
2)特殊输入测试(读入0个字符时)
解题思路:
1)使用哈希表
class Solution { public: //定义构造函数 Solution():index(0){ for(int i=0;i<256;i++) occurrence[i]=-1; //初始化为-1,表示还字符没有出现过 } //Insert one char from stringstream void Insert(char ch) { if(occurrence[ch]==-1) occurrence[ch]=index; else if(occurrence[ch]>=0) //表示该字符已经出现过一次 occurrence[ch]=-2; index++; } //return the first appearence once char in current stringstream char FirstAppearingOnce() { //如果字符流为空的时候 char ch='#'; //认真读题,注意题目要求的返回值 int minV = numeric_limits<int>::max(); //初始化为int能表示的最大值 for(int i=0;i<256;i++){ if(occurrence[i]>=0 && occurrence[i]< minV){ ch=char(i); //将ASCII码转为对应的字符 minV = occurrence[i]; } } return ch; } private: int occurrence[256]; int index; //表示字符在字符流中的位置 };
std::numeric_limits为模板类,使用时需要添加头文件#include<limits>
比较常用的使用是对于给定的基础类型用来判断在当前系统上的最大值、最小值。
支持的基础算术类型包括如下
2)其他一些方法,大多是将字符流存起来,string或者vector,然后寻找的时候遍历字符流的所有字符,判断哈希表或者map中字符出现的次数。无论是空间复杂度还是时间复杂度都比方法1高