解题思路
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; }