码迷,mamicode.com
首页 > 其他好文 > 详细

第一个只出现一次的字符

时间:2015-05-17 00:38:43      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b

 

由于题目与字符出现的次数相关,我们可以统计每个字符在该字符串中出现的次数。要达到这个目的,我们需要一个数据容器来存放每个字符的出现次数。在这个数据容器中可以根据字符来查找它出现的次数,也就是说这个容器的作用 是把一个字符映射成一个数字。在常用的数据容器中,哈希表正是这个用途。哈希表是一种比较复杂的数据结构。由于比较复杂,STL中没有实现哈希表,因此需要我们自己实现一个。

由于字符(char)是一个长度为8的数据类型,因此总共有可能256 种可能。首先申请一个长度为256的表,对每个字符进行hash计数即可。因为C/C++中有3种char类型:char,signed char,unsigned char。在对字符进行hash时,应该先将字符转为无符号类型;否则将下标出现负值时就会出现越界访问。

 

我们第一遍扫描这个数组时,每碰到一个字符,在哈希表中找到对应的项并把出现的次数增加一次。这样在进行第二次扫描时,就能直接从哈希表中得到每个字符出现的次数了。

代码如下:

 

 1 char get(char *pString)
 2 {
 3     //  考虑全面
 4     if(!pString)
 5         return 0;
 6     const int size = 256;
 7     unsigned int hash[size];
 8 
 9     for(int i=0;i<256;i++)
10         hash[i]=0;
11 
12     char *hashKey = pString;
13 
14     while((*hashKey)!=\0)
15     {
16         //  转为unsigned char型,防止下标出现负数
17         ++hash[(unsigned char)*(hashKey++)];
18     }
19     hashKey = pString;
20     while((*hashKey)!=\0)
21     {
22         if(hash[(unsigned char)*hashKey]==1)
23             return *hashKey;
24         hashKey++;
25     }
26 
27     return 0;
28 }

 

参考:http://zhedahht.blog.163.com/。

 

第一个只出现一次的字符

标签:

原文地址:http://www.cnblogs.com/balingybj/p/4508892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!