|
1 | 1 | class Solution {
|
2 |
| - public String reorganizeString(String S) { |
3 |
| - int buffer = S.length()%2 == 0 ? S.length()/2 : S.length()/2 + 1; |
4 |
| - Map<Character, Integer> map = new HashMap<>(); |
5 |
| - char[] chars = S.toCharArray(); |
6 |
| - |
7 |
| - for (char c : chars) { |
8 |
| - map.put(c, map.getOrDefault(c, 0) + 1); |
9 |
| - if (map.get(c) > buffer) { |
10 |
| - return ""; |
11 |
| - } |
12 |
| - } |
13 |
| - |
14 |
| - return createString(map); |
| 2 | + public String reorganizeString(String s) { |
| 3 | + Map<Character, Integer> map = new HashMap<>(); |
| 4 | + for (char c : s.toCharArray()) { |
| 5 | + map.put(c, map.getOrDefault(c, 0) + 1); |
15 | 6 | }
|
16 |
| - |
17 |
| - private String createString(Map<Character, Integer> map) { |
18 |
| - PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> b[1] - a[1]); |
19 |
| - for (char c : map.keySet()) { |
20 |
| - pq.add(new int[] {c, map.get(c)}); |
21 |
| - } |
22 |
| - |
23 |
| - StringBuilder sb = new StringBuilder(); |
24 |
| - while (!pq.isEmpty()) { |
25 |
| - int[] first = pq.poll(); |
26 |
| - if (sb.length() == 0 || first[0] != sb.charAt(sb.length() - 1)) { |
27 |
| - sb.append((char) first[0]); |
28 |
| - if (--first[1] > 0) { |
29 |
| - pq.add(first); |
30 |
| - } |
31 |
| - } |
32 |
| - else { |
33 |
| - int[] second = pq.poll(); |
34 |
| - sb.append((char) second[0]); |
35 |
| - if (--second[1] > 0) { |
36 |
| - pq.add(second); |
37 |
| - } |
38 |
| - pq.add(first); |
39 |
| - } |
| 7 | + PriorityQueue<Character> pq = new PriorityQueue<>( |
| 8 | + (o1, o2) -> map.get(o2).compareTo(map.get(o1))); |
| 9 | + pq.addAll(map.keySet()); |
| 10 | + StringBuilder sb = new StringBuilder(); |
| 11 | + while (!pq.isEmpty()) { |
| 12 | + char removed = pq.poll(); |
| 13 | + if (!sb.isEmpty() && sb.charAt(sb.length() - 1) == removed) { |
| 14 | + if (pq.isEmpty()) { |
| 15 | + return ""; |
40 | 16 | }
|
| 17 | + char secondRemoved = pq.poll(); |
| 18 | + pq.add(removed); |
| 19 | + sb.append(secondRemoved); |
| 20 | + updateStructure(map, pq, secondRemoved); |
| 21 | + } else { |
| 22 | + sb.append(removed); |
| 23 | + updateStructure(map, pq, removed); |
| 24 | + } |
| 25 | + } |
| 26 | + return sb.toString(); |
| 27 | + } |
41 | 28 |
|
42 |
| - return sb.toString(); |
| 29 | + private void updateStructure(Map<Character, Integer> map, PriorityQueue<Character> pq, char c) { |
| 30 | + map.put(c, map.get(c) - 1); |
| 31 | + if (map.get(c) > 0) { |
| 32 | + pq.add(c); |
| 33 | + } else { |
| 34 | + map.remove(c); |
43 | 35 | }
|
| 36 | + } |
44 | 37 | }
|
0 commit comments