VIRTUALS

the virtual labs for the virtuals

0%

LeetCode 451. 根据字符出现频率排序

摘要:
STL sort() 配合Lambda表达式排序。

题目

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

示例 1:

输入:

“tree”
输出:
“eert”
解释:
‘e’出现两次,’r’和’t’都只出现一次。
因此’e’必须出现在’r’和’t’之前。此外,”eetr”也是一个有效的答案。

示例 2:

输入:

“cccaaa”
输出:
“cccaaa”
解释:
‘c’和’a’都出现三次。此外,”aaaccc”也是有效的答案。
注意”cacaca”是不正确的,因为相同的字母必须放在一起。

示例 3:

输入:

“Aabb”
输出:
“bbAa”
解释:
此外,”bbaA”也是一个有效的答案,但”Aabb”是不正确的。
注意’A’和’a’被认为是两种不同的字符。


排序

先将字符计数,再根据计数来排序。
需要注意的地方是,当两个不同字符频率相同时,可能会出现顺序打乱的情况,比如说 $a$ 出现 $2$ 次,$b$ 出现 $2$ 次,那么输出可能是 $abab$。
为了避免这样的情况,我们需要在不同字符出现相同频率后再按照ascii码排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
string frequencySort(string s) {
unordered_map<char, int> cnt;
int len = s.size();
for (int i = 0; i < len; i++)
cnt[s[i]]++;
sort(s.begin(), s.end(), [&](char a, char b) {
if (cnt[a] != cnt[b]) return cnt[a] >= cnt[b];
return a < b;
});
return s;
}
};

为什么要用Lambda呢,因为leetcode排序 cmp 如果写在类里面需要加 static (不加会隐式的加上this指针),cmp 中需要用到 cnt 数组或者哈希表,这时候就需要将 cnt 数组或者哈希表放在类变量中或者类外面。如果放在类变量中,因为 cmp 函数时 static 的,那么 cnt 数组或者哈希表也需要是 static 的,就会出现一些很奇怪的问题。如果放在类外面,因为leetcode的问题也会出现一些很奇怪的问题比如执行测试用例可以过但是提交评测无法通过的情况。具体请看:
在LeetCode刷题应尽量避免使用全局变量