经典面试题--字符串系列(二)--找出第一个出现一次的字符

题目:在字符串中找出第一个出现一次的字符串,如输入“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 欢迎关注)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值