struct cmp {
bool operator() (pair<string, int> &p1, pair<string, int> &p2) {
return p1.second > p2.second || (p1.second == p2.second && p1.first < p2.first); //出现次数较高或者出现次数相同字典序小的优先级高(堆顶的元素优先级最低)
}
};
class Solution {
public:
vector<vector<string> > topKstrings(vector<string>& strings, int k) {
vector<vector<string> > res;
unordered_map<string, int> umap; //用于统计字符串出现次数
for(string &s: strings) umap[s]++;
priority_queue<pair<string, int>, vector<pair<string, int> >, cmp> pq; //自定义优先队列
for(auto it = umap.begin(); it != umap.end(); it++) { //遍历无序map
if(pq.size() < k) pq.emplace(pair<string, int> {it->first, it->second}); //当堆元素数小于k直接入堆
else if(it->second > pq.top().second || (it->second == pq.top().second && it->first < pq.top().first)) { //否则判断是否能取出堆顶放入新元素
pq.pop();
pq.emplace(pair<string, int> {it->first, it->second});
}
}
while(!pq.empty()) { //由优先级从小到大依次取出
res.emplace_back(vector<string> {pq.top().first, to_string(pq.top().second)});
pq.pop();
}
reverse(res.begin(), res.end()); //逆转使优先级从大到小
return res; //返回结果
}
};