【算法19】第一个只出现一次的字符

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

【思 路1】其实我看到这道题的第一个反应就是哈希表呀!当然我是学习过哈希表之后才这么说的,对于之前,我们的思路当然是,从头到尾遍历字符串,对于遍历到的每一个字符,拿它后面的每一个字符和它比较,如果没有和它相等的字符,那么它就是我们所要找的。很容看出来这种算法的时间复杂度是O(n2).

【思 路2】当然哈希表啦!所有学习过哈希表的同学都知道哈希表的查找速度是O(1)。我的第一个反映是建立26个字母的哈希表,当然这没有包含各种标点符号,控制字符等,所以为了全面起见,我们建立长度为256的哈希表(每一个char字符占用8bit,所能表示的种类就只有256种)。有了这个表,下面的就很简单了,首先遍历一遍字符串,就字符的ASCII值作为我们哈希表的键值,而数组中的value值存储每一个字符出现的次数。第二遍遍历字符串,取出第一个value值为1的键值即可。根据这种思路,我们很容易得到如下的代码:

 1 #include<iostream>
2 #include<string>
3 #include<cstring>
4 using namespace std;
5
6 char FindFirstNotRepeatedChar(char *pstring)
7 {
8 if(pstring == NULL)
9 return 0;
10
11 //定义并初始化哈希表
12 const int hashLength = 256;
13 unsigned int hashList[hashLength];
14 for(int i = 0;i < hashLength;++i)
15 {
16 hashList[i] = 0;
17 }
18
19 //第一遍遍历,hash表记录每个字符出现的次数
20 char *pchar = pstring;
21 while(*pchar != '\0')
22 {
23 hashList[*pchar]++;
24 pchar++;
25 }
26
27 //指针重新指向字符串的第一个字符
28 pchar = pstring;
29
30 //第二遍遍历,返回第一个次数为1的字符
31 while(*pchar != '\0')
32 {
33 if(hashList[*pchar] == 1)
34 {
35 return *pchar;
36 }
37
38 pchar++;
39 }
40
41 //没有只出现一次的字符
42 return 0;
43 }
44
45 int main()
46 {
47 cout<<"please enter your string:"<<endl;
48 const int maxSize = 100;
49 char str[maxSize];
50 cin>>str;
51
52 cout<<"the first not repeated char is:"<<endl;
53 cout<<FindFirstNotRepeatedChar(str)<<endl;
54
55 return 0;
56 }

  运行结果如下:


 

References:

程序员面试题精选100题:http://zhedahht.blog.163.com/blog/static/25411174200722191722430/

注:

1)本博客所有的代码环境编译均为win7+VC6。所有代码均经过博主上机调试。

2)博主python27对本博客文章享有版权,网络转载请注明出处http://www.cnblogs.com/python27/。对解题思路有任何建议,欢迎在评论中告知。

posted @ 2011-12-12 22:36  python27  阅读(1329)  评论(1编辑  收藏  举报