如果字符串中不含有任何 '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" 也是一种正确答案。
思路
贪心策略:每次选取当前剩余字符最多的进行构建(前提是不出现如【aaa】形式的字符串)
- 代码
public String longestDiverseString(int a, int b, int c) {
//优先队列,自定义排序规则(第二个数从大到小排序,保证了先使用剩余字符最多的字符
PriorityQueue<int[]> queue = new PriorityQueue<>((x,y) -> y[1]-x[1]);
//(字符编号, 字符剩余数量)
if (a>0) queue.add(new int[]{0,a});
if (b>0) queue.add(new int[]{1,b});
if (c>0) queue.add(new int[]{2,c});
StringBuilder builder = new StringBuilder();
while (!queue.isEmpty()){
int[] poll = queue.poll();
int len = builder.length();
//有连续两个相同字母
if (len>=2 && builder.charAt(len-1)-'a'==poll[0] && builder.charAt(len-2)-'a'==poll[0]){
if (queue.isEmpty())
break;
//添加第二多的字母
int[] cur = queue.poll();
builder.append((char)(cur[0]+'a'));
//如果不为0,则添加到队列中,进行下一次循环
if (--cur[1]>0)
queue.add(cur);
queue.add(poll);
}
else{
builder.append((char)(poll[0]+'a'));
if (--poll[1]>0){
queue.add(poll);
}
}
}
return builder.toString();
}