剑指Offer

剑指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] != ''){
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
", min_index);
41     }
42     
43     return 0;
44 }
原文地址:https://www.cnblogs.com/zhuli19901106/p/3436379.html