题目:在字符串中找出第一个出现一次的字符。如输入"abaccdeff",则输出'b'。
分析:最直观的解法从头扫描这个字符串中的每一个字符。当访问到某个字符的时候拿这个字符和后面的字符相比较,如果在后面没有发现重复的字符,那该字符就是只出现一次的字符。如果字符串有n个字符,每一个字符可能与后面的O(n)个字符比较,一次这种思路的时间复杂度是O(n^2)。
另外一种解法就是使用哈希表,实现哈希表,字符是一个长度为8的数据结构类型,我们使用一个大小为256的数组来实现哈希表。第一次扫描的时候,在哈希表中更新一个字符的时间是O(1),如果字符串的长度为n,那么第一次扫描的时间复杂度为O(n)。第二次扫描的时候,同样O(1)能读出一个字符出现的次数,所以时间复杂度仍然是O(n)。总的时间复杂度就是O(n)。同时,我们需要一个包含256个字符的数组,数组大小为常数,因此可以认为这种算法的空间复杂度是O(1)。
测试用例:
功能测试(字符串中存在只出现一次的字符,不存在只出现一次的字符,字符串中的所有字符都只出现一次)
特殊输入测试(字符串为NULL指针)
代码如下:
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 *HashKey=pString;
while(*HashKey!='\0')
{
HashTable[*(HashKey++)]++;
}
char *HashKey=pString;
while(*HashKey!='\0')
{
if(HashTable[*HashKey]==1)
{
return *HashKey;
}
else
HashKey++;
}
}