1405. 最长快乐字符串

题目描述

如果字符串中不含有任何 ‘aaa’,‘bbb’ 或 ‘ccc’ 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。

给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:

s 是一个尽可能长的快乐字符串。
s 中 最多 有a 个字母 ‘a’、b 个字母 ‘b’、c 个字母 ‘c’ 。
s 中只含有 ‘a’、‘b’ 、‘c’ 三种字母。
如果不存在这样的字符串 s ,请返回一个空字符串 “”。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-happy-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

算法分析

总体来说利用贪心的方法进行操作
将a,b,c的个数进行排序
每次从三者中最多的提取出一个记为char

  • 假如ans的尾以及ans的次尾都等于char,则加入次多的放在ans尾
  • 否则则将最多的加入ans尾部

我们可以采用priority_queue进行排序以及动态维护最多和次多的字母(priority_queue<pair<int, int> > pq;)
然后不断的从pq中找出最大的次大的,加入后减少次数并判断是否减为0,假如减为0则pop出队列
当队列为空则程序结束

参考代码

class Solution {
public:
    string longestDiverseString(int a, int b, int c) {
        string ans;
        priority_queue<pair<int, int> > pq;
        if(a) pq.push({a,0}); // 插入a,b,c的个数
        if(b) pq.push({b,1});
        if(c) pq.push({c,2});
        while(!pq.empty()){
            pair<int,int> first=pq.top();
            pq.pop();
            if (ans.size() >= 2 && first.second + 'a' == ans[ans.size() - 1] && first.second + 'a' == ans[ans.size() - 2]) {
            //首先判断ans的长度,再判断ans的尾是否为pd.top(),再判断ans的次尾是否为pd.top(),如果都符合则应该插次多在最尾
                if (pq.empty()) break;
                pair<int,int> second=pq.top();
                pq.pop();
                ans +=  ('a' + second.second);
                second.first -= 1;
                if (second.first != 0 )//判断是否个数为0
                    pq.push(second);
                pq.push(first);
            }
            else{//插入最多的一个字符
                ans += ('a' + first.second);
                first.first -= 1;
                if (first.first != 0 )//判断是否个数为0
                    pq.push(first);
            }
        }
        return ans;
    }
};

1405. 最长快乐字符串

上一篇:力扣 面试题 16.11. 跳水板


下一篇:mt9638和t972哪个好