字符串排序
题目描述
编写一个程序,将输入字符串中的字符按如下规则排序(一个测试用例可能包含多组数据,请注意处理)。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
示例1
输入
A Famous Saying: Much Ado About Nothing (2012/8).
输出
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
代码:
/*
A Famous Saying: Much Ado About Nothing (2012/8).
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
*/
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<unordered_map>
using namespace std;
string s;
struct node{
char c;
int i;
char orignal;
};
bool cmp(node a,node b){
if(a.c!=b.c)
return a.c<b.c;
else
return a.i<b.i;
}
char to_lower(char c){
if(c>='a'&&c<='z')
return c;
else
return c-'A'+'a';
}
int main(){
while(getline(cin,s)){
unordered_map<char,int> re;
vector<char> res(s.size(),'a');
int cnt=0;
node *sort_list=new node[s.size()];
for(int i=0;i<s.size();i++){
if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'){
sort_list[cnt++]={to_lower(s[i]),re[to_lower(s[i])],s[i]};
re[to_lower(s[i])]++;
}
else{
res[i]=s[i];
}
}
sort(sort_list,sort_list+cnt,cmp);
cnt=0;
for(int i=0;i<res.size();i++){
if(res[i]=='a'){
res[i]=sort_list[cnt++].orignal;
}
}
for(int i=0;i<res.size();i++)
printf("%c",res[i]);
printf("\n");
}
return 0;
}