一个直接的思路是直接重写sort的排序规则, 这里用字典统计词频,然后直接通过lamda表达式根据词频排序,有一个细节需要注意,lamda拿到外面的hashmap,需要使用特别的方式
class Solution { public: string frequencySort(string s) { unordered_map<char, int> dict; for (const auto &c : s) { dict[c]++; } sort(s.begin(), s.end(), [&](const char a,const char b) { return dict[a] > dict[b] || (dict[a] == dict[b] && a < b); }); return s; } };但是这样的效率很低。另一种思路是先做成key,value,然后组装成答案。
class Solution { public: string frequencySort(string s) { unordered_map<char, int> ump; for (const auto &c : s) { ++ump[c]; } vector<pair<char, int>> vec; for (const auto &m : ump) { vec.push_back(m); } sort(vec.begin(), vec.end(), [](const pair<char, int> &p1, const pair<char, int> &p2) { return p1.second > p2.second; }); string ret; for (const auto &v : vec) { ret += string(v.second, v.first); } return ret; } };Python写法(语法题)
class Solution: def frequencySort(self, s: str) -> str: dic = {} res = "" for c in s: dic[c] = dic.get(c,0) + 1 sorted_dic = sorted(dic.items(), key=lambda x: x[1], reverse=True) for x in sorted_dic: res += x[0] * x[1] return res
Python 一行代码
class Solution: def frequencySort(self, s: str) -> str: return "".join(k * v for k, v in collections.Counter(s).most_common())