剑指Offer - 九度1283 - 第一个只出现一次的字符

剑指Offer - 九度1283 - 第一个只出现一次的字符
2013-11-21 21:13
题目描述:

在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符。

输入:

输入有多组数据
每一组输入一个字符串。

输出:

输出第一个只出现一次的字符下标,没有只出现一次的字符则输出-1。

样例输入:
ABACCDEFF

AA
样例输出:
1

-1
题意分析:
  题目要求给定一个大写字母的字符串,找出第一个只出现了一次的字符的下标,从0开始。
  由于ascii字符不过128个,用长度为256的数组就能记录下每个字符第一次出现的下标。另外定义EMPTY表示字符未出现过,DUPLICATED表示字符已经重复出现了。
  对于每一个字符,
    若计数为EMPTY,则记录当前下标。
    若记录为正数,表示此字符出现了一次,置为DUPLICATED。
    若为DUPLICATED,说明已经重复过了,不用再改。
  扫一遍整个字符串和统计数组,时间复杂度strlen(str) + 256,数组空间复杂度256。选出最小的下标值即为不重复第一个字符。
 1 // 652691    zhuli19901106    1283    Accepted    点击此处查看所有case的执行结果    1020KB    771B    10MS

 2 // 201311171707

 3 #include <cstdio>

 4 using namespace std;

 5 

 6 int main()

 7 {

 8     const int MAXN = 10005;

 9     int i;

10     char s[MAXN];

11     int c[256];

12     int min_index;

13     const int EMPTY = -1;

14     const int DUPLICATED = -2;

15     

16     while(scanf("%s", s) == 1){

17         i = 0;

18         for(i = 0; i < 256; ++i){

19             c[i] = EMPTY;

20         }

21         i = 0;

22         while(s[i] != '\0'){

23             if(c[s[i]] == EMPTY){

24                 c[s[i]] = i;

25             }else{

26                 c[s[i]] = DUPLICATED;

27             }

28             ++i;

29         }

30         min_index = EMPTY;

31         for(i = 0; i < 256; ++i){

32             if(c[i] > 0){

33                 if(min_index == EMPTY){

34                     min_index = c[i];

35                 }else{

36                     min_index = c[i] < min_index ? c[i] : min_index;

37                 }

38             }

39         }

40         printf("%d\n", min_index);

41     }

42     

43     return 0;

44 }

你可能感兴趣的:(字符)