信息学奥赛一本通——1130:找第一个只出现一次的字符

【题目描述】
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。

【输入】
一个字符串,长度小于100000。

【输出】
输出第一个仅出现一次的字符,若没有则输出no。

【输入样例】
abcabd
【输出样例】
c

代码如下

#include
using namespace std;
char a[100000];
bool b[100000]; //布尔型变量以判断
int main()
{
	memset(b,true,sizeof(b));
	scanf("%s",a); //输入字符串
	for(int i=0;a[i]!='\0';i++) //这里不能写成"i<=strlen(a)",否则会超时
	{
		if(b[i]) //如果它不跟前面的相等
			for(int j=i+1;a[j]!='\0';j++) //往后枚举
				if(a[i]==a[j]) //如果跟后面的相等
				{
					b[i]=false; //判断变量改错
					b[j]=false; //后面的也要改错
				}
	}
	for(int i=0;a[i]!='\0';i++)
		if(b[i]) //如果只出现一次
		{
			cout<<a[i]; //输出
			return 0; //结束程序
		}
	cout<<"no"; //否则输出"no"
	return 0; //养成好习惯
} 

我前几次交,后几个点都超时
经过优化后
将“ i<=strlen(a) ”改成“ a[i]!=’\0’ ”
这是一个需要注意的地方

你可能感兴趣的:(题目)