🔗 leetcode.com/problems/co…
题目
- 给一个由小写字母组成的字符串 s
- 给一个数字 repeatLimit,表示某个字母可以连续出现的最大次数
- 返回由 s 的字符组成的,满足 repeatLimit 条件的最大字典序的字符串
思路
- 优先队列,按照字母字典序的大根堆
- 模拟 repeatLimit 的条件
代码
class Solution {
public:
string repeatLimitedString(string s, int repeatLimit) {
vector<int> freq(26);
for (int i = 0; i < s.size(); i++) {
freq[s[i] - 'a']++;
}
std::priority_queue<int, vector<int>> hp;
for (int i = 0; i < freq.size(); i++) {
if (freq[i]) {
hp.push(i);
}
}
string ans;
while (hp.empty() == false) {
int index = hp.top(); hp.pop();
int minimum = min(freq[index], repeatLimit);
for (int i = 0; i < minimum; i++) {
ans.push_back('a' + index);
}
freq[index] -= minimum;
if (freq[index]) {
if (hp.empty()) return ans;
int second = hp.top(); hp.pop();
ans.push_back('a' + second);
freq[second]--;
hp.push(index);
if (freq[second]) hp.push(second);
}
}
return ans;
}
};