题目:在字符串中找出第一个出现一次的字符串,如输入“abaccdeff”,输出‘b’
分析:由于题目与字符串出现次数有关,我们可以统计每个字符在该字符串中出现的次数,要达到这个目的,我们需要一个数据容器来存放每个字符出现的次数。
这个数据容器中,可以根据字符查找它出现的次数,也就是说这个容器的作用就是把一个字符映射成一个数字。于是,我们考虑哈希表
我们可以定义哈希表的键值(key)是字符,而值(value)是字符出现的次数同时我们还需要从头开始扫描字符串两次。
第一次扫描字符串是,每次扫描到一个字符就在哈希表的对应项中把次数加1,接着第二次扫描时,每当扫描一个字符就能从哈希表中得到该字符出现的次数。这样第一次出现一次的字符就符合要求。
字符是一个长度为8的数据类型,因此共有256种可能,我们创建一个256的数组。每个字母根据其ASCII码值作为数组的下标对应数组的一个数字,而数组中存储的是每个字符出现的次数。这样我们就创建了一个大小为256,一字符ASCII为键值的哈希表。
第一次扫描时,在哈希表中更新一个字符出现的次数是O(1),如果字符长度为n,那么扫描时间复杂度是O(n),第二次扫描时,同样O(1)就能读出。
总的时间复杂度为O(n)
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char FirstNotRepeatingChar(char *pString)
{
if(pString==NULL)
{
return '\0';
}
const int tableSize = 256;
unsigned int hasTable[tableSize];
unsigned int i=0;
for(i=0;i<tableSize;i++)
{
hasTable[i] = 0;
}
char *pHashKey=pString;
while((*pHashKey)!='\0')
{
hasTable[*pHashKey]++;
pHashKey++;
}
pHashKey=pString;
while(*pHashKey!='\0')
{
if(hasTable[*(pHashKey)]==1)
{
return *pHashKey;
}
pHashKey++;
}
return '\0';
}
int main()
{
char str[256];
printf("enter string:");
gets(str);
printf("fistNotRepeatingChar: %2c",FirstNotRepeatingChar(str));
return 0;
}
参考网站:http://blog.chinaunix.net/uid-25434387-id-3527923.html
(本人微博:http://weibo.com/2729471010/profile?topnav=1&wvr=5&user=1 微信号:yuansanwan 欢迎关注)