欢迎来到 Franklin-Qi 的世界

Max
Min

字符串中第一个只出现一次的字符

一、题目

在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。

二、问题分析

需要一个数据容器(哈希表)存放每个字符出现的次数,把一个个字符映射成一个数字。哈希表的键值(Key)是字符,值(Value)是该字符出现的次数。
通过2次字符串扫描,第1次进行制作哈希表,第2次每扫描到一个字符,就从哈希表中得到该字符出现的次数。那么,第1个只出现1次的字符就是结果。

C++标准模板库中的map和unordered_map实现了哈希表功能,但本题较简单,我们可以考虑实现一个简单的哈希表。
字符(char)是一个长度为8的数据类型,总共有256中可能。于是,我们创建1个长度为256的数组,
每个字母根据ASCII码作为数组下标对应数字的1个数字,而数组中存储的是每个字符出现的次数。
这样,我们就创建了1个大小为256、以字符ASCII码为键值的哈希表。

时间复杂度:O(n)

空间复杂度:O(1)

char FirstNotRepeatingChar(const char* pString)
{
    if(pString == nullptr)
        return '\0';

    const int tableSize = 256;
    unsigned int hashTable[tableSize];
    for(unsigned int i = 0; i < tableSize; ++i)
        hashTable[i] = 0;

    const char* pHashKey = pString;
    while(*(pHashKey) != '\0')
        hashTable[*(pHashKey++)] ++;

    pHashKey = pString;
    while(*pHashKey != '\0')
    {
        if(hashTable[*pHashKey] == 1)
            return *pHashKey;

        pHashKey++;
    }

    return '\0';
}

posted on 2020-08-22 17:46  yusq77  阅读(243)  评论(0编辑  收藏  举报

导航