-
在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符。
-
输入有多组数据
每一组输入一个字符串。 -
输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1。
-
ABACCDEFF AA
-
1 -1
-
题目描述:
-
输入:
-
输出:
-
样例输入:
-
样例输出:
/*
解决方案:建立一个数组,以每个字符的ASCII码作为存放该字符个数的下标索引,由于字符的ASCII的范围在0~255,
所以数组的大小设为256即可,开始时数组初始化为0,遍历字符串,将每个字符的个数存储在以该字符
以ASCII值为下标的数组的对应位置;再次从头开始遍历字符串,遍历到第一次出现字符的个数为1的字符
时,直接返回该字符,如果遍历到尾部,仍没有发现个数为1的字符,返回'\0。
注:剑指offer中将该该数组认为是哈希表的形式,是有道理的,相当于将该字符的ASCII为键(key),
个数为值(value)
*/
#include<iostream>
#include<cassert>
#include<cstdlib>
using namespace std;
#define HS_TABSIZE 256//
#define MAX 10000
int FristNotRepeatChar(char * pString)
{
assert(pString!=NULL);
int hashtable[HS_TABSIZE];
for(int i=0;i<HS_TABSIZE;i++)
{
hashtable[i]=0;
}
char *index=pString;
for(;*index!='\0';index++)
{
hashtable[*index]++;
}
index=pString;
for(;*index!='\0';index++)
{
if(hashtable[*index]==1)
return (index-pString);
}
return -1;
}
int main(void)
{
char *str=new char[MAX];
while(cin>>str)
{
int chr=FristNotRepeatChar(str);
cout<<chr<<endl;
}
delete []str;
return 0;
}
/**************************************************************
Problem: 1283
User: 慢跑的小蜗
Language: C++
Result: Accepted
Time:70 ms
Memory:1520 kb
****************************************************************/