方法一:用哈希表,把字符串对应一个数组HashTable中。全部的字符总共有256个,建立一个HashTable[256]。第一步:遍历字符串,根据字符的值来统计hashtable[字符],字符出现一次,那么对应的数组元素加一此时时间复杂度O(logn);第二步:找出数组中第一个次数为一的元素并返回,时间复杂度O(logn);所以总的时间复杂度O(logn)。空间复杂度O(256)常数级别,应该是O(1)。
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024
char *FindNotRepeatchar(char *pstr)
{
if (pstr == NULL)
return '\0';
unsigned HashTable[256] = { 0 };
char *temp = pstr;
while (*temp != '\0')
{
HashTable[*temp++]++;
}
temp = pstr;
while (*temp != '\0')
if (HashTable[*temp] == 1)
return *temp;
else
++pstr;
return '\0';
}
int main()
{
char str[MAXSIZE];
gets(str);
printf("第一个只出现一次的字符是:%c \n",FindNotRepeatchar(str));
return 0;
}
方法二:用一个buffer数组记录当前找到的只出现一次的字符,避免对原字符串进行第二次遍历
#include <stdio.h>
#include <string.h>
#define MAXSIZE 1024
char *FindNotRepeatchar(char *pstr)
{
if (pstr == NULL)
return 0;
unsigned count[256] = { 0 };
char buffer[256];
char *p = pstr;
//biffer数组存储当前找到的只出现一次的字符
char *q = buffer;
while (*p)
{
//当count[*p]+1等于1时表明该字符第一次出现,把字符存入buffer数组中并继续遍历字符串
//当一个字符出现第二次时++count[*p]等于2,所以不符合,继续下一个字符
if (++count[*p] == 1)
{
*q++ = *p++;
}
else
++p;
}
//遍历buffer数组中的字符并返回第一个只出现一次的字符
for (char *temp = buffer;temp < q;++temp)
{
if (count[*temp] == 1)
return *temp;
}
return 0;
}
int main()
{
char str[MAXSIZE];
gets(str);
printf("第一个只出现一次的字符是:%c\n",FindNotRepeatchar(str));
return 0;
}