zoukankan      html  css  js  c++  java
  • 【算法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/。对解题思路有任何建议,欢迎在评论中告知。

  • 相关阅读:
    UVA 10600 ACM Contest and Blackout(次小生成树)
    UVA 10369
    UVA Live 6437 Power Plant 最小生成树
    UVA 1151 Buy or Build MST(最小生成树)
    UVA 1395 Slim Span 最小生成树
    POJ 1679 The Unique MST 次小生成树
    POJ 1789 Truck History 最小生成树
    POJ 1258 Agri-Net 最小生成树
    ubuntu 用法
    ubuntu 搭建ftp服务器,可以通过浏览器访问,filezilla上传文件等功能
  • 原文地址:https://www.cnblogs.com/python27/p/2285379.html
Copyright © 2011-2022 走看看