查詢表的演算法//根據字元出現頻率排序
阿新 • • 發佈:2018-11-11
給定一個字串,請將字串裡的字元按照出現的頻率降序排列。
示例 1:
輸入: "tree" 輸出: "eert" 解釋: 'e'出現兩次,'r'和't'都只出現一次。 因此'e'必須出現在'r'和't'之前。此外,"eetr"也是一個有效的答案。
示例 2:
輸入: "cccaaa" 輸出: "cccaaa" 解釋: 'c'和'a'都出現三次。此外,"aaaccc"也是有效的答案。 注意"cacaca"是不正確的,因為相同的字母必須放在一起。
示例 3:
輸入: "Aabb" 輸出: "bbAa" 解釋: 此外,"bbaA"也是一個有效的答案,但"Aabb"是不正確的。 注意'A'和'a'被認為是兩種不同的字元。
class Solution { public: string frequencySort(string s) { string res=""; priority_queue<pair<int,char>> q; unordered_map<char,int> m; for(char c:s) ++m[c]; for(auto a:m) q.push({a.second,a.first}); while(!q.empty()){ auto t = q.top(); q.pop(); res.append(t.first,t.second); } return res; } };
class Solution { public: string frequencySort(string s) { unordered_map<char,int> m; for(char c:s) ++m[c]; sort(s.begin(),s.end(),[&](char &a,char &b){ return m[a]>m[b]||(m[a]==m[b]&&a<b); }); return s; } };
class Solution {
public:
string frequencySort(string s) {
string res = "";
vector<string> v(s.size()+1,"");
unordered_map<char,int> m;
for(char c:s) ++m[c];
for(auto &a:m){
v[a.second].append(a.second,a.first);
}
for(int i=s.size();i>0;i--){
if(!v[i].empty()){
res.append(v[i]);
}
}
return res;
}
};