字符串-----找出第一个只出现一次的字符

方法一:用哈希表,把字符串对应一个数组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;
}

猜你喜欢

转载自blog.csdn.net/weixin_39916039/article/details/81530802