POJ找第一个只出现一次的字符(多种方法)

1.问题描述


POJ找第一个只出现一次的字符(多种方法)


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;
}