题目描述
小明给儿子小小明买了一套英文字母卡片(总共包含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 }