剑指offer 字符流中第一个不重复的字符

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

输出描述:

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

 

题目分析:我们需要判断字符是不是只出现了一次的, 在所有只出现了一次的字符中找到最先出现的。

因为只有字符, 我们用hash[256]的值表示出现的索引。下标表示字符,初始化所有字符都未出现(-1), 如果第一次出现,就将其赋值为索引值。如果之前出现过了,就标记为-2.

 返回只出现一次且索引值最小的字符。

 1 class Solution
 2 {
 3 private:
 4     int ind[256];
 5     int index;
 6 public:
 7     Solution(){
 8         for (int i = 0; i < 256; i++) {
 9             ind[i] = -1;
10         }
11         index = 0;
12     }
13   //Insert one char from stringstream
14     void Insert(char ch)
15     {
16         if (ind[ch] == -1)
17              ind[ch] = index;
18         else if (ind[ch] >= 0)
19             ind[ch] = -2;
20         index++;
21     }
22   //return the first appearence once char in current stringstream
23     char FirstAppearingOnce()
24     {
25         char res = '#';
26         int minindex = INT_MAX;
27         for (int i = 0; i < 256; i++) {
28             if (ind[i] >= 0) {
29                 if (ind[i] < minindex) {
30                     res = char(i);
31                     minindex = ind[i];
32                 }
33             }
34         }
35         return res;
36     }
37 
38 };

 

posted @ 2019-09-06 15:07  琴影  阅读(301)  评论(0编辑  收藏  举报