Leetcode 5195. 最长快乐字符串(贪心)
题目描述:
如果字符串中不含有任何 '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; } };