注释很详细,直接上代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string get;
while(cin>>get)
{
int sz=get.size();
map<char, int> mp;//用来存放出现的字符以及其出现的次数
for(int i=0;i<sz;i++)
{
if(mp.find(get[i])!=mp.end())
{
(mp.find(get[i])->second)++;
}
else
mp.insert(pair<char, int> (get[i],1));
}
set<int> times;//用来存储当前字符串中字符出现个数的种类
for(auto a:mp)
{
times.insert(a.second);
}
string ret;//作为最终的返回值
for(auto b:times)
{
string factor;//按字典序接收出现重复次数相同的字符串
for(auto a: mp)
{
if(a.second==b)
{
factor+=a.first;//按照字典序进行追加
}
}
//进行逆制,因为此时的输出顺序是从出现个数小的往大的出,最终结果需要逆制,
//因此,提前逆制按字典序追加的字符串,最后输出时可以保证输出正确
reverse(factor.begin(), factor.end());
ret+=factor;//把当前结果追加到最终返回值后面
}
//将从小到大输出转化为从大到小输出,并保证输出次数相同字符按字典序输出,得到最终返回值
reverse(ret.begin(), ret.end());
cout<<ret<<endl;
}
return 0;
}