当两个字母的小写形式相同时,比较它们在原字符串中的位置,按输入顺序排列,这样排序后相同字母的顺序会保持输入顺序。如果小写不同,则按小写顺序排列。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool isLetter(char c) {
    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}

bool cmp(const pair<int, char>& a, const pair<int, char>& b) {
    char lowerA = tolower(a.second);
    char lowerB = tolower(b.second);
    if (lowerA != lowerB) {
        return lowerA < lowerB; // 按字母顺序排序
    } else {
        return a.first < b.first; // 字母相同时按原位置排序
    }
}

int main() {
    string input;
    while (getline(cin, input)) {
        vector<pair<int, char>> letters;
        // 提取所有字母及其位置
        for (int i = 0; i < input.size(); i++) {
            if (isLetter(input[i])) {
                letters.push_back({i, input[i]});
            }
        }
        // 按规则排序字母
        sort(letters.begin(), letters.end(), cmp);
        // 重构字符串
        int cnt = 0;
        for (int i = 0; i < input.size(); i++) {
            if (isLetter(input[i])) {
                input[i] = letters[cnt++].second;
            }
        }
        cout << input << endl;
    }
    return 0;
}