zoukankan      html  css  js  c++  java
  • 哈希查找

    问题:找出字符串中第一个只出现一次的字符,字符串区分大小写。比如输入字符串ddFDfsdfdsllf,就应该输出F。

    注:哈希查找算法的查找效率是很高的,是一种利用空间换时间思想的典型算法。

      1 #include<iostream>
      2 #include<cstdlib>
      3 #include<string>
      4 #include<cctype>
      5 using namespace std;
      6 class Firstchar
      7 {
      8 public:
      9     int n;  //共52个大小写字母
     10     string s; //输入的字符串,只能含有大小写
     11     typedef struct Hash   //哈希表单元,存储字符和次数
     12     {
     13         char ch;
     14         int num;
     15     };
     16     Hash *HashTable;
     17     char first;    //第一次只出现一次的字符
     18 
     19     Firstchar(const string &str)
     20     {
     21         n = 52;
     22         HashTable = new Hash[n];
     23         if (!HashTable)
     24         {
     25             cout << "内存不足,程序退出!";
     26             exit(1);
     27         }
     28         int i;
     29         for (i = 0; i < n; i++)
     30         {
     31             HashTable[i].ch = '';
     32             HashTable[i].num = 0;
     33         }
     34         s = str;
     35     }
     36     ~Firstchar()
     37     {
     38         delete[] HashTable;
     39     }
     40 
     41     int HashFuction(char ch);  //哈希函数
     42     void LoadHashTable();        //装载哈希表
     43     char findOnlyOneChar();        //寻找最先出现的不重复字符
     44 
     45 };
     46 int Firstchar::HashFuction(char ch)   //哈希函数 小写字母存在0-25的位置,大写字母存在26-51的位置
     47 {
     48     if (islower(ch))
     49     {
     50         return ch - 'a';
     51     }
     52     else return ch - 'A' + n / 2;
     53 }
     54 
     55 void Firstchar::LoadHashTable()  //装载哈希表
     56 {
     57     int i;
     58     int pos;
     59     for (i = 0; i < s.length(); i++)
     60     {
     61         pos = HashFuction(s[i]);
     62         if (!HashTable[pos].ch)  //如果这个位置为空
     63         {
     64             HashTable[pos].ch = s[i];
     65             HashTable[pos].num = 1;
     66         }
     67         else
     68             HashTable[pos].num++;
     69     }
     70 }
     71 char Firstchar::findOnlyOneChar()
     72 {
     73     LoadHashTable();
     74     int position;
     75     for (int i = 0; i < s.length(); i++)
     76     {
     77         position = HashFuction(s[i]);
     78         if (this->HashTable[position].num == 1)  //该字符出现的次数为1
     79         {
     80             first = s[i];
     81             return first;
     82         }
     83     }
     84     return NULL;
     85 }
     86 
     87 void main()
     88 {
     89     string str;
     90     cout << "请输入一个字符串:";
     91     cin >> str;
     92     if (!cin.good())
     93     {
     94         cout << "输入异常!" << endl;
     95         exit(1);
     96     }
     97     for (int i = 0; i < str.length(); i++)
     98     {
     99         if (!islower(str[i]) && !isupper(str[i]))
    100         {
    101             cout << "字符串只能包含大小写字符!" << endl;
    102             return;
    103         }
    104     }
    105     Firstchar Firstchar(str);
    106     char answer = Firstchar.findOnlyOneChar();
    107     if (answer == '')
    108     {
    109         cout << "该字符串没有不重复的字符" << endl;
    110     }
    111     else
    112     {
    113         cout << "第一次出现的不重复字符为:" << answer << endl;
    114     }
    115     system("pause");
    116 
    117 }
    坚持比努力更重要
  • 相关阅读:
    【甘道夫】Hadoop2.2.0 NN HA详细配置+Client透明性试验【完整版】
    zookeeper学习资源
    Java jdbc数据库连接池
    几种任务调度的 Java 实现方法与比较
    java常用集合类详解(有例子,集合类糊涂的来看!)
    Eclipse上GIT插件EGIT使用手册
    MongoDB 数据备份、恢复与迁移管理
    Mongodb快速入门之使用Java操作Mongodb
    mongodb高可用集群搭建
    Mongodb常见错误
  • 原文地址:https://www.cnblogs.com/dameidi/p/9269518.html
Copyright © 2011-2022 走看看