题目:
在字符串中找到第一个只出现一次的字符。如输入“abaccdeff”,输出'b'。
最直观的做法:从头开始扫描这个字符串中每个字符。当访问到某个字符时,拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符为只出现一次字符。若字符串有n个字符,那么时间复杂度为O(n^2)。
哈希表法:
由于题目与字符出现的次数相关,因此需要统计每个字符在字符串中出现的次数。
可以定义一个哈希表,key为字符,value为该字符出现的次数。
需要从头开始扫描字符串两次,第一次用于给哈希表赋值,第二次就可以直接得到出现的次数,这样第一个出现一次的字符就是符合要求的输出。
如何创建哈希表?
char是一个长度为8的数据类型,因此有256种可能。于是可以创建一个长度为256的数组,每个字母根据其ASCII码值作为数组的下标对应数组的一个数字,而数组存储的是每个字符出现的次数。
时间复杂度=O(n),空间复杂度=O(1)。
char FirstNotRepeatingChar(char* pString)
{
if(pString==NULL)
return '\0';
const int tablesize=256;
unsigned int hashTable[tablesize];
for(unsigned int i=0;i<tablesize;i++)
hashTable[i]=0;
char* pHashKey=pString;
while(*pHashKey!='\0')
{
hashTable[*(pHashKey)]++;
}
pHashKey=pString;
while(*pHashKey!='\0')
{
if(hashTable[*pHashKey]==1)
return *pHashKey;
pHashKey++;
}
return '\0';
}
总结:如果需要判断多个字符是否在某个字符串里出现过或者统计多个字符在某个字符串中出现的次数,可以考虑基于数组创建一个简单的哈希表,这样可以用很小的空间消耗换来时间效率的提升。