LeetCode Solutions
767. Reorganize String
Time: $O(n\log 26) = O(n)$ Space: $O(n)$
class Solution {
public:
string reorganizeString(string s) {
unordered_map<char, int> count;
int maxFreq = 0;
for (const char c : s)
maxFreq = max(maxFreq, ++count[c]);
if (maxFreq > (s.length() + 1) / 2)
return "";
string ans;
priority_queue<pair<int, char>> maxHeap; // (freq, c)
int prevFreq = 0;
char prevChar = '@';
for (const auto& [c, freq] : count)
maxHeap.emplace(freq, c);
while (!maxHeap.empty()) {
// Get the most freq letter
const auto [freq, c] = maxHeap.top();
maxHeap.pop();
ans += c;
// Add the previous letter back so that
// Any two adjacent characters are not the same
if (prevFreq > 0)
maxHeap.emplace(prevFreq, prevChar);
prevFreq = freq - 1;
prevChar = c;
}
return ans;
}
};
public class Solution {
public String reorganizeString(String s) {
Map<Character, Integer> count = new HashMap<>();
int maxFreq = 0;
for (final char c : s.toCharArray()) {
count.merge(c, 1, Integer::sum);
maxFreq = Math.max(maxFreq, count.get(c));
}
if (maxFreq > (s.length() + 1) / 2)
return "";
StringBuilder sb = new StringBuilder();
// (freq, c)
Queue<Pair<Integer, Character>> maxHeap =
new PriorityQueue<>((a, b) -> b.getKey() - a.getKey());
int prevFreq = 0;
char prevChar = '@';
for (final char c : count.keySet())
maxHeap.offer(new Pair<>(count.get(c), c));
while (!maxHeap.isEmpty()) {
// Get the most freq letter
final int freq = maxHeap.peek().getKey();
final char c = maxHeap.poll().getValue();
sb.append(c);
// Add the previous letter back so that
// Any two adjacent characters are not the same
if (prevFreq > 0)
maxHeap.offer(new Pair<>(prevFreq, prevChar));
prevFreq = freq - 1;
prevChar = c;
}
return sb.toString();
}
}
class Solution:
def reorganizeString(self, s: str) -> str:
count = Counter(s)
if max(count.values()) > (len(s) + 1) // 2:
return ''
ans = []
maxHeap = [(-freq, c) for c, freq in count.items()]
heapq.heapify(maxHeap)
prevFreq = 0
prevChar = '@'
while maxHeap:
# Get the most freq letter
freq, c = heapq.heappop(maxHeap)
ans.append(c)
# Add the previous letter back so that
# Any two adjacent characters are not the same
if prevFreq < 0:
heapq.heappush(maxHeap, (prevFreq, prevChar))
prevFreq = freq + 1
prevChar = c
return ''.join(ans)