POJ找第一个只出现一次的字符(多种方法)
1.问题描述
2.算法分析
a.
我这里使用的是最笨的方法,就是每一次取出字符串中的一个字符依次比较,我是将输入的字符串复制到另一个字符串,然后逐一比较,因为要找到第一个没有重复的字符。那么就相当于找到以后马上跳出循环。没有重复出现的字符必然只有一个,经过循环判断可得。
b.
听朋友说也是可以使用128个ASCALL值判断,就是将每次输入的ASCALL值读取,然后对每次输入的ASCALL值与之前输入的比较,这一个相当于优化了空间毕竟定义的数组小了。
源代码:
a.
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str1[100001];
char str2[100001];
int main()
{
gets(str1);
strcpy(str2,str1);
int flag = 0;
for(int i = 0;i<strlen(str1);i++)
{
int sum = 0;
for(int j = 0;j<strlen(str2);j++)
{
if(str1[i]!=str2[j])
sum++;
}
if(sum == (strlen(str2)-1))
{
cout<<str1[i]<<endl;
break;
}
else
{
flag++;
if(flag == strlen(str2))
{
cout<<"no"<<endl;
break;
}
}
}
return 0;
}
b.
#include<iostream>
#include<cstring>
using namespace std;
int a[128];
char b[100010];
int main()
{
int flag=0; //判断是否存在只出现一次的字符标志
cin.getline(b,100001);
int s=strlen(b);
for(int i=0;i<s;i++)
a[b[i]]++;
for(int i=0;i<s;i++)
{
int t=(int)b[i];
if(a[t]==1)
{
flag=1;
cout<<b[i]<<endl;
break;
}
}
if(flag==0)
cout<<"no"<<endl;
return 0;
}