问题描述 :
给定一个字符串,请将字符串里的字符按照出现的频率降序排列,如果频率相同,则按照字符的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
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
static bool cmp(pair<char,int> a,pair<char,int> b){
if(a.second==b.second){//字母出现次数相同 按照ASCII排序
return a.first<b.first;
}
return a.second>b.second;//否则按照字母出现次序排
}
string frequencySort(string s) {
map<char,int> m;
for(int i=0;i<s.length();i++){
m[s[i]]++;//对每个字母进行累加
}
string res="";
vector<pair<char,int>> v(m.begin(),m.end());//将map放入到vector中
sort(v.begin(),v.end(),cmp);
for(vector<pair<char,int>>::iterator it=v.begin();it!=v.end();it++){
while(it->second>0){//循环放入到res中
res+=it->first;
it->second--;
}
}
return res;
}
int main(){
string s;
cin>>s;
string res=frequencySort(s);
cout<<res<<endl;
return 0;
}