题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
思路1:利用C++ STL的hash_map来统计每个字符出现的次数,维护一个Key为Query字串,Value为该Query出现次数的HashTable,即 Hashmap(Query,Value),每次读取一个Query,如果该字串不在Table中,那么加入该字串,并且将Value值设为1;如果该字 串在Table中,那么将该字串的计数加一即可。
思路2:由于字符(char)是一个长度为8的数据类型,因此总共有可能256 种可能。于是我们创建一个长度为256的数组,每个字母根据其ASCII码值作为数组的下标对应数组的对应项,而数组中存储的是每个字符对应的次数。这样我们就创建了一个大小为256,以字符ASCII码为键值的哈希表。我们第一遍扫描这个数组时,每碰到一个字符,在哈希表中找到对应的项并把出现的次数增加一次。这样在进行第二次扫描时,就能直接从哈希表中得到每个字符出现的次数了。
- // ab.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include<stdio.h>
- #include <iostream>
- #include <hash_map>
- using namespace stdext;
- using namespace std;
- char FindFirstNotRepeat(char *str)
- {
- hash_map<char,int> count;
- int i=0;
- while(str[i]!='\0')
- {
- hash_map<char,int>::iterator exist=count.find(str[i]);
- if(exist==count.end())
- count.insert(make_pair(str[i],1));
- else
- (*exist).second++;
- i++;
- }
- hash_map<char,int>::iterator iter=count.begin();
- i=0;
- while(str[i]!='\0')
- {
- hash_map<char,int>::iterator exist=count.find(str[i]);
- if((*exist).second==1)
- return (*exist).first;
- i++;
- }
- return 0;
- }
- char FindFirstNotRepeat2(char *str)
- {
- const int tablesize=256;
- int count[tablesize];
- memset(count,0,sizeof(int)*tablesize);
- int i=0;
- while(str[i]!='\0')
- {
- count[str[i]]++;
- i++;
- }
- i=0;
- while(str[i]!=NULL)
- {
- if(count[str[i]]==1)
- return str[i];
- i++;
- }
- return 0;
- }
- void main()
- {
- char b[]="abaccdeff";
- char a=FindFirstNotRepeat2(b);
- cout<<a;
- }
注意:以上代码是在VS2005下执行的,VC6.0下hash_map不可用