题目描述:
在给定的一个字符串中,找出第一次出现且个数为1的字符;
例如输出“aabcceedfiijj”,则结果为:‘b’
思路一:
从字符串的首字符扫描,将其与后面的字符分别进行比较,若被访问的字符与后面的字符皆不同,则其为所求;
假设字符串长度为n,每个字符与后面的O(n)字符比较,故时间复杂度为O(n*n)
思路二:
我们要找到的字符其个数为1,那么我们可以按照顺序统计每个不同字符出现的次数;
然后在从其中找出第一个出现且次数为1的字符;
则需要一个数据结构承载不同字符的次数,我们想到了利用哈希表的结构,牺牲空间换取时间的提高;
代码实现:
#include<iostream>
using namespace std;
//---------------------------------------------------------------只出现一次的第一个字符--------------------------------------------------------------------
char FindFirst(char* pString)
{
if(pString == NULL)
return '\0';
const int size = 256;
unsigned int HashTable[size];
for(int i = 0; i < size; ++i) #数组初始化,皆为0
HashTable[i] = 0;
char* pStr = pString;
while(*pStr != '\0') #顺序统计每个字符的次数
{
HashTable[*(pStr++)]++;
}
pStr = pString;
while(*pStr != '\0') #寻找第一次出现且个数为1的字符
{
if(HashTable[*pStr] == 1)
return *pStr;
pStr++;
}
return '\0';
}
int main()
{
char* pString = "aabccdef";
char p = FindFirst(pString);
cout<<p<<endl;
}