当两个字母的小写形式相同时,比较它们在原字符串中的位置,按输入顺序排列,这样排序后相同字母的顺序会保持输入顺序。如果小写不同,则按小写顺序排列。
#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; }