用结构体把源字符串中是字母(不区分大小写)的位置和字符(都装成小写字母)存下来;
struct strw{
int pos;
char c;
strw(int p,char cc):pos(p),c(cc){}
inline bool operator<(const strw &v)const{
if(c==v.c)return pos<v.pos;//如果字符相等,看位置靠前的(事先已经都转成小写字母)
else return c<v.c;
}
};
vector<strw> vec; //用vector存储结构体最后一步,再输出时,如果字符是字母,按照vec进行输出;然后对比同位置的字符,如果是大写的,就把小写转成大写。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
struct strw{
int pos;
char c;
strw(int p,char cc):pos(p),c(cc){}
inline bool operator<(const strw &v)const{
if(c==v.c)return pos<v.pos;
else return c<v.c;
}
};
vector<strw> vec;
int main(){
string s;
while(getline(cin,s)){
vec.clear();
for(int i=0;i<s.size();i++){
if((s[i]>='a'&&s[i]<='z') || (s[i]>='A'&&s[i]<='Z')){
if(s[i]>='A'&&s[i]<='Z'){
vec.push_back(strw(i,char(s[i]-'A'+'a')));//都转成小写
}else vec.push_back(strw(i,char(s[i])));
}
}sort(vec.begin(),vec.end());
int j=0;
for(int i=0;i<s.size();i++){
if(s[i]>='a'&&s[i]<='z' || s[i]>='A'&&s[i]<='Z'){
if(s[vec[j].pos]>='A'&&s[vec[j].pos]<='Z'){
cout<<char(vec[j].c-'a'+'A');
}else cout<<vec[j].c;
j++;
}else{
cout<<s[i];
}
}
cout<<endl;
}
return 0;
} 


京公网安备 11010502036488号