题目描述
给你一个只包含小写字母的字符串。
请你判断是否存在只在字符串中出现过一次的字符。
如果存在,则输出满足条件的字符中位置最靠前的那个。
如果没有,输出 no。
输入输出
输入格式
共一行,包含一个由小写字母构成的字符串。
数据保证字符串的长度不超过 100000。
输出格式
输出满足条件的第一个字符。
如果没有,则输出 no。
样例
输入:abcccebcd
输出:a
源码
一
优化前
双重循环,依次比对,开数组且初始化为零(此处比较费空间,第二种解法对其进行优化。
#include<iostream>
#include<cstring>
using namespace std;
char a[100010];
int c[100000] = {0};
int main(){
cin >> a;
for(int i = 0, len = strlen(a); i < len; i ++){
for(int j = 0, len = strlen(a); j < len; j ++){
if(a[i] == a[j])
c[i] ++;
}
if(c[i] == 1){
printf("%c\n", a[i]);
return 0;
}
}
printf("no\n");
return 0;
}
二
优化后
我们利用两个字母ascall码相减后是数字,然后我们为了保证这个数大于零,所以我们减去‘a’,即将字母a,b,c,d…分别映射为0,1,2,3…等,所以我们很自然地就把记录每个字母出现的次数的那个数组优化成了cnt[26]
include<cstring>
using namespace std;
int cnt[26];
char str[100010];
int main()
{
cin >> str;
for(int i = 0,len = strlen(str);i < len; i ++ ) cnt[str[i] - 'a' ] ++ ;
for(int i = 0,len = strlen(str);i < len ; i ++ )
if(cnt[str[i] - 'a'] == 1)
{
cout << str[i] << endl;
return 0;
}
puts("no");
return 0;
}