注意:这道题的特点是查找出现一次的字符,那么就可以利用字符的特点,因为字符的个数不可能大于256,所以就可以用一个含有256个元素的数组统计所有字符出现的次数,最后再遍历一遍数组,找到次数为1的字符即可。
//在一个字符串中查找第一次只出现一次的字母,要求复杂度为O(N)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
unsigned int find_first_only(const char *str)
{
char ascii[256];//定义一个数组:统计字符出现的次数
const char *ret = str;
assert(str);
memset(ascii,0,sizeof(ascii));
while (*str != '\0')//统计字符出现的次数
{
ascii[(int)*str]++;
str++;
}
while (*ret != '\0')//查找这个只出现一次的字符
{
if (ascii[(int)*ret] == 1)
{
return *ret;
}
ret++;
}
return 256;
}
int main()
{
char *msg = "abnhdtebnahd1234";
unsigned int ret = 0;
ret = find_first_only(msg);
if (ret < 256)
{
printf("%c \n",ret);
}
else
{
printf("Not Found\n");
}
system("pause");
return 0;
}