Leetcode 451 根据字符出现频率排序(Lambda 表达式自定义排序规则)

it2024-11-05  4

一个直接的思路是直接重写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())

 

 

 

最新回复(0)