问题描述:
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
分析:这道题是2006年google的一道笔试题。对于这道题我们可以采用我对华为那道面试题分析时,扩展部分所运用的方法:哈希算法,在加上伴随数组。代码如下:
void find(char a[])
{
int temp[26] = {0}; //用于哈希运算统计每个字母出现的次序
int indextemp[26] = {0};//伴随数组用于统计每一个字母第一次出现的顺序
int len = strlen(a);
int index = 0;
int j = 1;
int temp1 = a[0];
for(int i = 0; i < len; i++)
{
index = a[i] - 'a'; // 哈希运算
temp[index]++;
if(temp[index] ==0)
{
j++;
indextemp[index] = j; //统计每个字母第一次出现的顺序;
}
}
int min = j;//这时j中存的是26的字母中有那几个出现
index = 0;
bool flag = false; //用于标识是否有字母只出现一次
for(int k = 0 ; k<len; k++)
{
if( temp[k] ==1)
{
flag = true;
if(indextemp[k] < min)
{
min = indextemp[k];
index = k;
}
}
}
index = index + 'a';
if(flag == true)
printf("%c",index);
else
printf("没有出现一次的字母");
}
这道题的算法复杂度已经达到o(n),已经很低了只用到两个单独for,可是空间复杂度较高。经过测试没有问题,当然测试不够全面,欢迎拍砖和改进