题解:
首先使用map进行记录每个字母的出现次数
再将map的内容反向写入multimap(设定次数从大到小排列)
由于map的默认排列是从小到大,因此字母小的先插入到multimap中
因此multimap的顺序就是:
key值(字母出现次数):从大到小
value值(字母表顺序):从小到大
详细过程见注释:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<char, int> m1;
multimap<int, char, greater<int>> m2;
vector<char> res;
string s;
cin >> s;
// 首先将输入字符串写入map
// 因为map的key不能重复,因此适用于记录字母出现次数
for(int i=0; i<s.size(); i++)
{
// 如果第一次出现则进行插入,插入后++则value值为1,再次出现就进行+1,以此记录出现次数
m1[s[i]]++;
}
// 再将map的内容写入multimap,但是将map的Key写入multimap的value;将map的value写入mutimap的key中
for(const auto& e: m1)
{
// multimap:m2定义时规定了按次数从大到小排列
// 由于map默认字母按从小到大排序,因此插入multimap时字母序小的先插入
m2.insert(make_pair(e.second, e.first));
}
// 此时m2的顺序为出现次数从大到小排列,如果次数相同按照字母顺序表从小到大排列
auto it = m2.begin();
for(const auto& p: m2)
{
// 如果和最大值相等插入res,如果不相等则直接退出
if(p.first == it->first)
{
res.push_back(p.second);
}
else
break;
}
for(const auto& r: res)
{
cout << r;
}
return 0;
}