解题思路
1.遍历字符串使用无序map保存非字母字符的位置及其元素,使用vector<pair<char, int>>保存字母元素及其位置,然后在sort函数基础上自定义排序即可;
代码
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
bool isAlpha(char ch){
return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z');
}
int main(){
string s;
getline(cin, s);
int n = s.size();
vector<pair<char, int>> v; //存储大小写英文字母及其位置
unordered_map<int, char> f; //存储其他字符及其位置
for(int i = 0; i < n; i++){
if(isAlpha(s[i])){
v.push_back({s[i], i});
}
else{
f[i] = s[i];
}
}
sort(v.begin(), v.end(), [&](pair<char, int>& p1, pair<char, int>& p2){
char c1 = p1.first, c2 = p2.first;
if('A' <= c1 && c1 <= 'Z') c1 += 32;
if('A' <= c2 && c2 <= 'Z') c2 += 32;
if(c1 == c2) return p1.second < p2.second; //按输入顺序排序
return c1 < c2; //按字符大小排序
});
for(int i = 0, j = 0; i < n; i++){
if(f.count(i)){
cout << f[i];
}
else{
cout << v[j].first;
j++;
}
}
return 0;
}
京公网安备 11010502036488号