思路是用哈希表记录每个字符出现的次数,然后通过出现的频次重新对s进行排序:
class Solution {
public:
string frequencySort(string s) {
unordered_map<char, int> mp;
for (auto c : s) mp[c]++;
sort(s.begin(), s.end(), [&](char a, char b) {
if (mp[a] == mp[b]) return a < b;
return mp[a] > mp[b];
});
return s;
}
};
上面使用了lambda表达式重载,其中[&]是表示捕获所有外部变量并且以引用的形式出现在表达式内部中,如果直接写
sort(s.begin(), s.end(), [](char a, char b) {
if (mp[a] == mp[b]) return a < b;
return mp[a] > mp[b];
});
将因为无法识别内部的mp[a]而报错,因为mp的定义没有被捕获进去。
435. 无重叠区间 区间贪心 sort重载这一题中就不需要捕获,因为只使用到了参数内部的vector,没有使用外部的变量或者对象,注意区别。
c++ lambda表达式捕获变量参数
[] 不捕获任何变量
[&] 捕获外部作用域中所有变量,并作为引用在函数体重使用
[=] 捕获外部作用域中所有变量,并作为副本在函数体重使用
[=,&foo] 捕获外部作用域中所有变量,并作为副本在函数体重使用,对于foo按引用捕获
[foo] 当作副本捕获foo,不引入其他变量
[this] 捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,则默认有此选项。捕获this的目的是在lambda中使用当前类的成员函数以及成员变量。