问题描述
给定一个字符串,请将字符串里的字符按照出现的频率降序排列,如果频率相同,则按照字符的ASCII码升序排列。
示例 1:
输入:
"tree"
输出:
"eert"
解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前,而且'r'比't'的ASCII码小。
示例 2:
输入:
"cccaaa"
输出:
"aaaccc"
解释:
'c'和'a'都出现三次。因此按照字符升序排列,'a'在'c'前。
示例 3:
输入:
"Aabb"
输出:
"bbAa"
解释:
'A'和'a'被认为是两种不同的字符,并且'A'的ASCII码比'a'小
输入说明
输入一个字符串
输出说明
输出一个字符串,字符串中字符的顺序请参考以上说明。
输入范例
Aabb
输出范例
bbAa
实现思路
遍历输入的字符串,用unordered_map来统计字母的频率。统计完后将unordered_map里的元素存入一个数组,对该数组进行排序,然后就可以用一个string来存最终结果并输出。
实现代码
#include <iostream>
#include <vector>
#include <string>
#include<algorithm>
#include<unordered_map>
using namespace std;
bool cmp(const pair<char,int>&a,const pair<char,int>&b){
if(a.second==b.second) return a.first<b.first;
else return a.second>b.second;
}
class Solution {
public:
string frequencySort(string s) {
unordered_map<char,int>mp;
for(int i = 0;i<s.size();i++){
mp[s[i]]++;
}
vector<pair<char,int>> res;
for(auto it:mp){
res.push_back(it);
}
sort(res.begin(),res.end(),cmp);
string resstr = "";
for(int i = 0;i<res.size();i++){
for(int j = 0;j<res[i].second;j++){
resstr += res[i].first;
}
}
return resstr;
}
};
int main()
{
string str;
cin>>str;
string res=Solution().frequencySort(str);
cout<<res;
return 0;
}