classSolution { public String strWithout3a3b(int a, int b) { StringBuildersb=newStringBuilder(); PriorityQueue<int[]> queue = newPriorityQueue<>((x, y) -> y[1] - x[1]); if (a > 0) queue.offer(newint[] { 0, a }); if (b > 0) queue.offer(newint[] { 1, b }); while (!queue.isEmpty()) { intlen= sb.length(); int[] cur = queue.poll(); if (len >= 2) { if (sb.charAt(len - 1) == (char) ('a' + cur[0]) && sb.charAt(len - 2) == (char) ('a' + cur[0])) { if (queue.isEmpty()) { break; } int[] next = queue.poll(); sb.append((char) ('a' + next[0])); if (--next[1] > 0) { queue.offer(next); } queue.offer(cur); } else { sb.append((char) ('a' + cur[0])); if (--cur[1] > 0) { queue.offer(cur); } } } else { sb.append((char) ('a' + cur[0])); if (--cur[1] > 0) { queue.offer(cur); } } } return sb.toString(); } }
思路二
另一种做法的思想是,因为 A 和 B 这两个字母一定有一个更多,我们可以将 A 和 B 先一一交替放入结果集,类似 ABABAB 这样,然后再考虑把多出来的字母插入 ABABAB 并且保证不要超过同时出现三次这个条件。所以我们先统计一下哪个字母更多,并生成那个 AB 交替的字符串。这里对于交替字符串的生成,我选择先放出现次数少的那个字母,因为这样我才可以将出现次数更多的字母 attach 到这个 StringBuilder 的最前面。如果多的字母还未用完,那么我可以尝试将这个较多的字母再放到每一个较少的字母后面。
classSolution { public String strWithout3a3b(int a, int b) { StringBuildersb=newStringBuilder(); charc1='a'; charc2='b'; // c1是较少的字母,c2是较多的字母 if (a > b) { c1 = 'b'; c2 = 'a'; }
while (a > 0 && b > 0) { sb.append(c1); sb.append(c2); a--; b--; }