一、题目
在字符串中找出第一个只出现一次的字符。如输入"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 ' ';
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) != ' ')
hashTable[*(pHashKey++)] ++;
pHashKey = pString;
while(*pHashKey != ' ')
{
if(hashTable[*pHashKey] == 1)
return *pHashKey;
pHashKey++;
}
return ' ';
}