剑指offer—求字符串中第一个只出现一次的字符

对于这个问题,常规思路我们进行分析,你首先肯定是喜欢先让指向一个字符,然后和它后面的每个字符进行比较,如果后面没有相同的字符的话,这个字符就是你所要找的第一个只出现一次的字符。
但是这种思路我们首先要比较n个字符,然后每个字符可能要与后面有n个字符比较,所以,最后我们可以知道这个的时间复杂度为O(n^2),作为一个精益求精的程序员,我想我们肯定要对此进行优化。

对于这个字符串,我们面对这里面所有的字符,我们只需要通过求出每一个单个字符出现的次数,然后通过这个次数来判定。在这我们可以采用数组来存放这些次数,当然,因为是字符串,所以每一个字符取值最多也就是256。

其实这种把一个字符映射成一个数字的数据容器,就是我们所说的哈希表
所以我们了解了原理,就可以在纸上写出我们的程序了。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define MAX_SIZE 256
char check_one_arr(const char *str)
{
    assert(str);
    unsigned int hash[MAX_SIZE] = { 0 };
    const char *p = str;
    while (*p!= '\0' )
    {
        hash[*p++]++;//在这所做的就是对每个字符所对应的哈希表元素进行次数统计
    }
    p = str;
    while (*p !='\0')
    {
        if (hash[*p] == 1)//这里进行判定第一个只出现一次的字符
            return *p;
        p++;
    }

    return *str;


}
int main()
{
    char *arr = "aabbcchddee";
    char ret=check_one_arr(arr);
    printf("%c", ret);
    system("pause");
    return 0;

}

在这里面,第一次扫描的时候,对数组,哈希表更新n个字符为O(n),然后第二次扫面的时候,采用O(1)能够都出一个字符出现的次数,所以这样时间复杂度会减小很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值