问题描述:
在字符串中找出第一个只出现一次的字符,例如字符串 str = “abcdabcdef “,那么对于这个字符串,第一个只出现一次的字符就是 e 。
首先这道题可以考虑遍历:从第一个字符开始,挨个与后面字符作比较,如果有重复的字符,就跳出本次循环,再从第二个字符开始往后比较,类似Bubble_Sort,在这种做法中,就是利用两层for循环就可以搞定。
但是时间复杂度为O(n^2),往往不是最优解法。
查找第N次出现的题目,首先要想到哈希思想。利用映射思想处理。
哈希处理的时间复杂度为 O(n),空间复杂度为常数。
哈希思想解决的好处就是提高程序运行效率。
char GetFirstChar(const char* str)
{
assert(str);
int HashTable[26] = {0};
char *ch = str;
while(*ch)
{
HashTable[*ch - 'a'] ++;
++ch;
}
ch = str;
while(*ch)
{
if(HashTable[*ch - 'a'] == 1)
{
return *ch;
}
++ch;
}
return -1;
}
如果这个字符串不仅仅是小写,还含有其他特殊符号怎么处理?只需要把哈希映射表扩容到256即可。因为字符是8bit类型,总共有256个字符。
char GetFirstChar(const char* str)
{
assert(str);
int HashTable[256] = {0};
char *ch = str;
while(*ch)
{
HashTable[(unsigned char)*ch ] ++;
++ch;
}
ch = str;
while(*ch)
{
if(HashTable[(unsigned char)*ch] == 1)
{
return *ch;
}
++ch;
}
return -1;
}