解题思路

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;
}