题目
Given a string s, sort it in decreasing order based on the frequency of the characters. The frequency of a character is the number of times it appears in the string.
Return the sorted string. If there are multiple answers, return any of them.
Example 1:
Input: s = “tree”
Output: “eert”
Explanation: ‘e’ appears twice while ‘r’ and ‘t’ both appear once.
So ‘e’ must appear before both ‘r’ and ‘t’. Therefore “eetr” is also a valid answer.
Example 2:
Input: s = “cccaaa”
Output: “aaaccc”
Explanation: Both ‘c’ and ‘a’ appear three times, so both “cccaaa” and “aaaccc” are valid answers.
Note that “cacaca” is incorrect, as the same characters must be together.
Example 3:
Input: s = “Aabb”
Output: “bbAa”
Explanation: “bbaA” is also a valid answer, but “Aabb” is incorrect.
Note that ‘A’ and ‘a’ are treated as two different characters.
Constraints:
- 1 <= s.length <= 5 * 105
- s consists of uppercase and lowercase English letters and digits.
代码
class Solution {
public:
static int cmp(const pair<char, int>& x, const pair<char, int>& y)
{
return x.second > y.second;
}
string frequencySort(string s) {
map<char, int> m;
for(int i = 0; i<s.length(); i++)
{
if(m.find(s[i]) != m.end())
m[s[i]]++;
else
m.insert(pair<char, int>(s[i], 1));
}
vector<pair<char, int>> v;
for(map<char, int>::iterator iter = m.begin(); iter != m.end(); iter++)
v.push_back(pair<char, int>(iter->first, iter->second));
sort(v.begin(), v.end(), cmp);
string res = "";
for(int i = 0; i<v.size(); i++)
{
for(int j = 0; j<v[i].second; j++)
res += v[i].first;
}
return res;
}
};
一次AC!^ ______________________________________ ^