1405.最长快乐字符串(优先队列+贪心)
问题:如果字符串中不含有任何 ‘aaa’,‘bbb’ 或 ‘ccc’ 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。
给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:
- s 是一个尽可能长的快乐字符串。
- s 中 最多 有a 个字母 ‘a’、b 个字母 ‘b’、c 个字母 ‘c’ 。
- s 中只含有 ‘a’、‘b’ 、‘c’ 三种字母。
如果不存在这样的字符串 s ,请返回一个空字符串 “”。
示例:
输入:a = 1, b = 1, c = 7
输出:"ccaccbcc"
解释:"ccbccacc" 也是一种正确答案。
输入:a = 2, b = 2, c = 1
输出:"aabbc"
输入:a = 7, b = 1, c = 0
输出:"aabaa"
解释:这是该测试用例的唯一正确答案。
思路:贪心,每次取频数最高的字符进行拼接
- 若组成的字符串最后两个字符都等于当前字符,则取频数第二高的字符进行拼接,若没有第二高字符,则返回结果。
- 若组成的字符串最后两个字符不等于当前字符,拼接当前字符
class Solution {
public String longestDiverseString(int a, int b, int c) {
PriorityQueue<int[]> queue = new PriorityQueue<>((o1, o2) -> o2[1] - o1[1]);
if(a != 0){
queue.offer(new int[]{0, a});
}
if(b != 0){
queue.offer(new int[]{1, b});
}
if(c != 0){
queue.offer(new int[]{2, c});
}
StringBuilder res = new StringBuilder();
while(!queue.isEmpty()){
int[] cur = queue.poll();
int len = res.length();
if(len >= 2 && cur[0] == res.charAt(len - 1) - 'a' && cur[0] == res.charAt(len - 2) - 'a'){
if(queue.isEmpty()){
break;
}
int[] next = queue.poll();
res.append((char) (next[0] + 'a'));
if(--next[1] > 0){
queue.offer(next);
}
queue.offer(cur);
} else {
res.append((char) (cur[0] + 'a'));
if(--cur[1] > 0){
queue.offer(cur);
}
}
}
return res.toString();
}
}
整理思路,记录博客,以便复习。若有误,望指正~