leetcode-每日一题2022.2.7 最长快乐字符串

题目

力扣

思路 贪心+优先队列

使用pair保存a、b、c出现的次数,并放入优先队列里,按照次数逆序。循环从优先队列中pop出元素,如果不违反三个连续字符不能相同的原则,就直接放入字符串后面;如果违反了三个连续字符不能相同的原则,就取出次数第二大的元素,添加到字符串后。

代码

class Solution {
public:
    // struct cmp{
    //     bool operator()(pair a,pair b){
    //         return a.first> pq;
        //pair的比较,先比较第一个元素,第一个相等比较第二个。
        //priority_queue,vector>,cmp> pq;
        if(a>0)pq.emplace(make_pair(a,0));
        if(b>0)pq.emplace(make_pair(b,1));
        if(c>0)pq.emplace(make_pair(c,2));
        string ans="";
        while(!pq.empty()){
            auto cur=pq.top();
            pq.pop();
            int n=ans.size();
            if(n>=2 && ans[n-1]-'a'==cur.second && ans[n-2]-'a'==cur.second){
                if(pq.empty()) break;
                auto next=pq.top();
                pq.pop();
                ans+=next.second+'a';
                if(--next.first!=0) pq.emplace(next);
                pq.emplace(cur);
            }else{
                ans+=cur.second+'a';
                if(--cur.first!=0) pq.emplace(cur);
            }
        }
        return ans;
    }
};

你可能感兴趣的:(leetcode,leetcode,贪心算法,算法)