题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"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 = ‘\0‘; 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 == ‘\0‘)//如果当前字符流没有存在出现一次的字符,返回#字符。 32 return ‘#‘; 33 return ch; 34 } 35 private: 36 int occurence[256];//其中数组下标i对应与ASCII码 37 int index;//存储第一个只出现一次的字符的索引 38 39 };
时间: 2024-10-05 21:52:09