題目描述
如果字符串中不含有任何 'aaa'
,'bbb'
或 'ccc'
這樣的字符串作爲子串,那麼該字符串就是一個「快樂字符串」。
給你三個整數 a,b ,c,請你返回 任意一個 滿足下列全部條件的字符串 s:
- s 是一個儘可能長的快樂字符串。
- s 中 最多 有
a
個字母 ‘a’、b 個字母 ‘b’、c 個字母 ‘c’ 。 - s 中只含有
'a'、'b' 、'c'
三種字母。 - 如果不存在這樣的字符串
s
,請返回一個空字符串""
。
示例 1:
輸入:a = 1, b = 1, c = 7
輸出:"ccaccbcc"
解釋:"ccbccacc"
也是一種正確答案。
示例 2:
輸入:a = 2, b = 2, c = 1
輸出:"aabbc"
示例 3:
輸入:a = 7, b = 1, c = 0
輸出:"aabaa"
解釋:這是該測試用例的唯一正確答案。
提示:
- 0 <=
a, b, c
<= 100 a + b + c
> 0
Solution
這道題的思路是我們先將字符和數量對應存在自定義的Char
類中,方便對Char
數組進行排序(從大到小,降序排列);這樣每次可以取出數量最多的(類似最大優先隊列);由於每次最多只能有兩個連續的字符,我們需要判斷前兩個字符是否和當前的數量最多的字符一致,一致的話我們不能繼續添加該字符,得看看是否存在第二多的字符(如果其他字符數量都是0
就不行了);不一致的話我們即可直接添加。按照這樣的策略就能得到最長的快樂字符串。
public String longestDiverseString(int a, int b, int c) {
StringBuilder sb = new StringBuilder();
// 初始化
Char[] ch = new Char[3];
ch[0] = new Char('a', a);
ch[1] = new Char('b', b);
ch[2] = new Char('c', c);
Arrays.sort(ch); // 降序排序
// 判斷是否需要繼續
while (check(ch)) {
int n = sb.length();
if (n >= 2) { // 當前長度大於2
// 前兩個字符與當前字符一致
if (sb.charAt(n - 1) == ch[0].ch && sb.charAt(n - 2) == ch[0].ch) {
if (ch[1].num > 0) { // 第二個字符非空,則添加第二個字符
sb.append(ch[1].ch);
ch[1].num--;
} else // 否則,無法繼續添加,終止循環
break;
} else { // 如果不一致,直接添加數量最多的字符即可
sb.append(ch[0].ch);
ch[0].num--;
}
} else { // 當前長度小於 2,直接把數量最多的字符添加進去即可
sb.append(ch[0].ch);
ch[0].num--;
}
// 對自定義的 Char 數組進行排序
Arrays.sort(ch);
}
return sb.toString();
}
/**
* 任意一個字符的數量非空
* @param ch
* @return
*/
public boolean check(Char[] ch) {
for (Char aChar : ch) {
if (aChar.num > 0)
return true;
}
return false;
}
/**
* 自定義類型,含字符和數量,並實現 Comparable 接口,方便根據 num 來排序
*/
class Char implements Comparable<Char> {
Integer num; // 數量
char ch; // 字符
Char(char ch, int num) {
this.ch = ch;
this.num = num;
}
/**
* 根據 num,降序排序
* @param o
* @return
*/
@Override
public int compareTo(Char o) { // 降序排序
return o.num.compareTo(this.num);
}
}