码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 5195. 最长快乐字符串(贪心)

时间:2020-04-06 09:41:14      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:lse   vector   选择   begin   排序   需要   second   空字符串   tco   

题目描述:

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

  • 给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:
  • s 是一个尽可能长的快乐字符串。
  • s 中 最多 有a 个字母 ‘a‘、b 个字母 ‘b‘、c 个字母 ‘c‘ 。
  • s 中只含有 ‘a‘、‘b‘ 、‘c‘ 三种字母。

  如果不存在这样的字符串 s ,请返回一个空字符串 ""

 

题解:

  每次找出a,b,c三个字符数量最多、次多的两个字符(把字母和出现的次数放在一个pair里面,之后排序就好了),从最多的字符里面取出两个、次多的字符取出一个加入字符串ans,重复上述操作。有几种情况要注意一下:

  1. 当次多的字符数为0的时候,最多的字符至多选择两个。

  2. 在加入出现最多的两个字符的时候,需要判断一下ans的末尾的字符时候和当前要加入的字符一致。一致的话就先把出现次数最少或次少的字符选一个加入字符串ans在执行加入操作。

 

AC代码:

  

class Solution {
public:
    string longestDiverseString(int a, int b, int c) {
        if((a == 0 && b == 0) || (b == 0 && c == 0) || (c==0 && a == 0)) return "";
        
        string ans ="";
        vector<pair<int,char>> vec;
        vec.push_back(make_pair(a,a));
        vec.push_back(make_pair(b,b));
        vec.push_back(make_pair(c,c));
        while(1)
        {
            sort(vec.begin(),vec.end());
            int mn = vec[0].first;
            int mid = vec[1].first;
            int mx = vec[2].first;
         
            if(mid == 0)
            {
                for(int i=0;i<min(2,mx);i++) ans+=vec[2].second;
                break;
            }

            if(mx == 1)
            {
                ans+=vec[2].second;
                ans+=vec[1].second;
                if(mn != 0) ans += vec[0].second;
                break;
            }
            cout << mn << " " << mid <<" " <<mx <<endl;
            if(ans.size()!=0 && ans[ans.size()-1] == vec[2].second)
            {
                if(mn != 0)
                {
                    ans+=vec[0].second;
                    vec[0].first--;
                }
                else
                {
                    ans+=vec[1].second;
                    vec[1].first--;
                }
                continue;
            }
            
            
          
                ans+=vec[2].second;
                ans+=vec[2].second;
                ans+=vec[1].second;
            
            vec[2].first -= 2;
            vec[1].first -= 1;
        }
        return ans;

    }
};

 

Leetcode 5195. 最长快乐字符串(贪心)

标签:lse   vector   选择   begin   排序   需要   second   空字符串   tco   

原文地址:https://www.cnblogs.com/z1141000271/p/12640568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!