If possible, output any possible result. If not possible, return the empty string.
Input: S = "aab"
Output: "aba"
Input: S = "aaab"
Output: ""
class Solution {
public String reorganizeString(String S) {
if (S == null || S.length() <= 1) {
return S;
}
int[] count = new int[256];
for (char c : S.toCharArray()) {
count[c]++;
}
PriorityQueue<CharInfo> maxHeap = new PriorityQueue<>();
for (int i = 0; i < 256; i++) {
if (count[i] > (S.length() + 1) / 2) {
return "";
}
if (count[i] != 0) {
maxHeap.add(new CharInfo((char)i, count[i]));
}
}
StringBuilder res = new StringBuilder();
while (!maxHeap.isEmpty()) {
CharInfo c1 = maxHeap.remove();
if (res.length() == 0 || c1.val != res.charAt(res.length() - 1)) {
res.append(c1.val);
if (--c1.count > 0) {
maxHeap.add(c1);
}
}
else {
CharInfo c2 = maxHeap.remove();
res.append(c2.val);
if (--c2.count > 0) {
maxHeap.add(c2);
}
maxHeap.add(c1);
}
}
return res.toString();
}
class CharInfo implements Comparable<CharInfo> {
char val;
int count;
public CharInfo(char val, int count) {
this.val = val;
this.count = count;
}
public int compareTo(CharInfo that) {
return that.count - this.count;
}
}
}
3. Time & Space Complexity