leetcode——767.重构字符串

思路

  1. 使用hashmap记录字母出现频率
  2. 如何重排不可行?size()小于2字母的最高出现频率大于length+1/2
  3. 将hashmap中不为0的元素放入优先队列中,每次取优先队列最高频率的两个字母作组合

代码

class Solution {
public:
    string reorganizeString(string s) {
        //无法重新排布
        if (s.length() < 2) 
            return s;
        
        //记录字母出现频率
        vector<int> counts(26, 0);
        int maxCount = 0;
        int length = s.length();
        for (int i = 0; i < length; i++) {
            char c = s[i];
            counts[c - 'a']++;
            //获取最大的出现频率
            maxCount = max(maxCount, counts[c - 'a']);
        }
        //不可行的情况
        if (maxCount > (length + 1) / 2) 
            return "";
        
        //将hashmap进行挑选 压入优先队列
        auto cmp = [&](const char& letter1, const char& letter2) {
            return counts[letter1 - 'a']  < counts[letter2 - 'a'];
        };
        priority_queue<char, vector<char>,  decltype(cmp)> queue{cmp};
        for (char c = 'a'; c <= 'z'; c++) {
            if (counts[c - 'a'] > 0) {
                queue.push(c);
            }
        }

		//字符串重排
        string sb = "";
        while (queue.size() > 1) {
            //取头两个字母进行组合
            char letter1 = queue.top(); queue.pop();
            char letter2 = queue.top(); queue.pop();
            sb += letter1;
            sb += letter2;
            //hashmap对应的字母出现频率更新
            int index1 = letter1 - 'a', index2 = letter2 - 'a';
            counts[index1]--;
            counts[index2]--;
            //取后出现频率仍大于0 压入栈
            if (counts[index1] > 0) 
                queue.push(letter1);
            if (counts[index2] > 0) 
                queue.push(letter2);
        }
        //size()为奇数情况下的最后一个元素
        if (queue.size() > 0) 
            sb += queue.top();
            
        return sb;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值