|
1 | 1 | class Solution {
|
2 |
| - public String longestDiverseString(int a, int b, int c) { |
3 |
| - PriorityQueue<int[]> priorityQueue = new PriorityQueue<>((o1, o2) -> o2[1] - o1[1]); |
4 |
| - if (a > 0) { |
5 |
| - priorityQueue.add(new int[]{0, a}); |
6 |
| - } |
7 |
| - if (b > 0) { |
8 |
| - priorityQueue.add(new int[]{1, b}); |
9 |
| - } |
10 |
| - if (c > 0) { |
11 |
| - priorityQueue.add(new int[]{2, c}); |
12 |
| - } |
13 |
| - StringBuilder sb = new StringBuilder("zz"); |
14 |
| - while (!priorityQueue.isEmpty()) { |
15 |
| - int[] temp = {-1, -1}; |
16 |
| - char peekChar = (char) ('a' + priorityQueue.peek()[0]); |
17 |
| - if (peekChar == sb.charAt(sb.length() - 1) && |
18 |
| - peekChar == sb.charAt(sb.length() - 2)) { |
19 |
| - temp[0] = priorityQueue.peek()[0]; |
20 |
| - temp[1] = priorityQueue.peek()[1]; |
21 |
| - priorityQueue.poll(); |
22 |
| - if (priorityQueue.isEmpty()) { |
23 |
| - break; |
| 2 | + public String longestDiverseString(int a, int b, int c) { |
| 3 | + PriorityQueue<LetterFrequencyPair> pq = |
| 4 | + new PriorityQueue<>((p, q) -> q.frequency() - p.frequency()); |
| 5 | + if (a > 0) { |
| 6 | + pq.add(new LetterFrequencyPair('a', a)); |
| 7 | + } |
| 8 | + if (b > 0) { |
| 9 | + pq.add(new LetterFrequencyPair('b', b)); |
| 10 | + } |
| 11 | + if (c > 0) { |
| 12 | + pq.add(new LetterFrequencyPair('c', c)); |
24 | 13 | }
|
25 |
| - } |
26 |
| - peekChar = (char) ('a' + priorityQueue.peek()[0]); |
27 |
| - if (peekChar != sb.charAt(sb.length() - 1) || |
28 |
| - peekChar != sb.charAt(sb.length() - 2)) { |
29 |
| - int[] removed = priorityQueue.poll(); |
30 |
| - sb.append(peekChar); |
31 |
| - removed[1]--; |
32 |
| - if (removed[1] > 0) { |
33 |
| - priorityQueue.add(removed); |
| 14 | + StringBuilder sb = new StringBuilder(); |
| 15 | + while (!pq.isEmpty()) { |
| 16 | + LetterFrequencyPair removed = pq.remove(); |
| 17 | + int frequency = removed.frequency(); |
| 18 | + int resultLength = sb.length(); |
| 19 | + if (resultLength >= 2 && |
| 20 | + sb.charAt(resultLength - 1) == removed.letter() && |
| 21 | + sb.charAt(resultLength - 2) == removed.letter()) { |
| 22 | + if (pq.isEmpty()) { |
| 23 | + break; |
| 24 | + } |
| 25 | + LetterFrequencyPair temp = pq.remove(); |
| 26 | + sb.append(temp.letter()); |
| 27 | + if (temp.frequency() - 1 > 0) { |
| 28 | + pq.add(new LetterFrequencyPair(temp.letter(), temp.frequency() - 1)); |
| 29 | + } |
| 30 | + } else { |
| 31 | + sb.append(removed.letter()); |
| 32 | + frequency--; |
| 33 | + } |
| 34 | + if (frequency > 0) { |
| 35 | + pq.add(new LetterFrequencyPair(removed.letter(), frequency)); |
| 36 | + } |
34 | 37 | }
|
35 |
| - } |
36 |
| - if (temp[0] != -1) { |
37 |
| - priorityQueue.add(temp); |
38 |
| - } |
| 38 | + return sb.toString(); |
39 | 39 | }
|
40 |
| - return sb.substring(2).toString(); |
41 |
| - } |
| 40 | + |
| 41 | + private record LetterFrequencyPair(char letter, int frequency) {} |
42 | 42 | }
|
0 commit comments