781. 趣味字母卡片

题目描述

小明给儿子小小明买了一套英文字母卡片(总共包含52张,区分大小写),小小明把卡片丢在地上玩耍,并从中取出若干张排成一排,形成了一个卡片序列。

此时,小明需要将卡片序列中的重复字母剔除(同一个字母的大小写只保留一个)。

请问,所有可能的结果中,字母序最小(不区分大小写)的序列的第一张卡片上是哪个字母?

输入格式

共一行,包含一个非空字符串,表示卡片序列,长度为N。

输出格式

共一行,包含一个字母(如果结果是大写字母,则需要转换成小写)。

数据范围

1≤N≤52

输入样例:

xaBXY

输出样例:

a

样例解释

剔除完后的结果是abxy。

思路

双指针扫描

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 
 5 using namespace std;
 6 int num[27];//记录每个字母的卡片数(a-97, A-65)
 7 string s;
 8 
 9 int main() {
10     cin>>s;
11     int len=s.length();
12     for(int i=0; i<len; i++) {
13         if(s[i]<'a') s[i]+=32;//若是大写,则改为小写 
14         num[s[i]-'a']++;
15     }
16     int p1=0, p2=1;
17     while(p2<len) {
18         if(num[s[p1]-'a']==1) break;//若s[p1]卡片只有一张,那么跳出循环
19         if(s[p1]<=s[p2] && num[s[p2]-'a']>1) {//若s[p2]更大且数量>1,则删除卡片p2
20             num[s[p2]-'a']--;
21             p2++;
22         }
23         else if(s[p1]>s[p2] && num[s[p1]-'a']>1) {//若s[p1]更大且数量>1,则删除卡片p1
24             num[s[p1]-'a']--;
25             p1=p2;
26             p2++;
27         }
28         else break;//若s[p2]卡片只有一张且s[p1]>s[p2],则跳出循环
29     }
30     cout<<s[p1]<<endl;
31     return 0;
32 }
原文地址:https://www.cnblogs.com/wwqzbl/p/13692818.html