|
1 | 1 | class Solution {
|
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); |
6 |
| - } |
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 ""; |
| 2 | + public String reorganizeString(String s) { |
| 3 | + Map<Character, Integer> map = new HashMap<>(); |
| 4 | + int maxFrequency = 0; |
| 5 | + char maxFrequencyLetter = ' '; |
| 6 | + int n = s.length(); |
| 7 | + for (char c : s.toCharArray()) { |
| 8 | + map.put(c, map.getOrDefault(c, 0) + 1); |
| 9 | + if (maxFrequency < map.get(c)) { |
| 10 | + maxFrequency = map.get(c); |
| 11 | + maxFrequencyLetter = c; |
| 12 | + } |
| 13 | + } |
| 14 | + if (maxFrequency > (n + 1) / 2) { |
| 15 | + return ""; |
16 | 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 |
| - } |
| 17 | + char[] letters = new char[s.length()]; |
| 18 | + int idx = 0; |
| 19 | + idx = insertLetter(n, map, maxFrequencyLetter, letters, idx); |
| 20 | + map.remove(maxFrequencyLetter); |
| 21 | + for (Character key : map.keySet()) { |
| 22 | + idx = insertLetter(n, map, key, letters, idx); |
| 23 | + } |
| 24 | + return String.valueOf(letters); |
25 | 25 | }
|
26 |
| - return sb.toString(); |
27 |
| - } |
28 | 26 |
|
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); |
| 27 | + private static int insertLetter(int n, Map<Character, Integer> map, char maxFrequencyLetter, char[] letters, int idx) { |
| 28 | + while (map.get(maxFrequencyLetter) > 0) { |
| 29 | + if (idx >= n) { |
| 30 | + idx = 1; |
| 31 | + } |
| 32 | + letters[idx] = maxFrequencyLetter; |
| 33 | + idx += 2; |
| 34 | + map.put(maxFrequencyLetter, map.get(maxFrequencyLetter) - 1); |
| 35 | + } |
| 36 | + return idx; |
35 | 37 | }
|
36 |
| - } |
37 | 38 | }
|
0 commit comments