题目描述
如果字符串中不含有任何 '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*/@Overridepublic int compareTo(Char o) {
// 降序排序return o.num.compareTo(this.num);}
}