LeetCode 2182. Construct String With Repeat Limit

41 阅读1分钟

🔗 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;
    }
};