public class Solution {
public String rearrangeString(String str, int k) {
int length = str.length();
int[] count = new int[26];
int[] valid = new int[26];
for(int i=0;i<length;i++){
count[str.charAt(i)-'a']++;
}
StringBuilder sb = new StringBuilder();
for(int index = 0;index<length;index++){
int candidatePos = findValidMax(count, valid, index);
if( candidatePos == -1) return "";
count[candidatePos]--;
valid[candidatePos] = index+k;
sb.append((char)('a'+candidatePos));
}
return sb.toString();
}
private int findValidMax(int[] count, int[] valid, int index){
int max = Integer.MIN_VALUE;
int candidatePos = -1;
for(int i=0;i<count.length;i++){
if(count[i]>0 && count[i]>max && index>=valid[i]){
max = count[i];
candidatePos = i;
}
}
return candidatePos;
}
}
public class Solution {
public String rearrangeString(String s, int k) {
int len = s.length();
int[] count = new int[26];
int[] valid = new int[26];
for(char c: s.toCharArray()) count[c-'a']++;
StringBuilder sb = new StringBuilder();
for(int i=0;i<len;i++){
int pos = getMax(count, valid, i);
if(pos== -1) return "";
sb.append((char) ('a'+pos));
count[pos]--;
valid[pos] = i +k;
}
return sb.toString();
}
private int getMax(int[] count, int[] valid, int begin){
int index = -1;
int max = 0;
for(int i=0;i< 26;i++){
if(count[i] > max && valid[i]<= begin){
index = i;
max = count[i];
}
}
return index;
}
}
public class Solution {
public String rearrangeString(String s, int k) {
StringBuilder res = new StringBuilder();
if (s == null || s.length() < 1) return res.toString();
Map<Character, Integer> map = new HashMap<>();
for (char c : s.toCharArray()) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
Queue<Map.Entry<Character, Integer>> maxHeap = new PriorityQueue<>(new Comparator<Map.Entry<Character, Integer>>(){
public int compare(Map.Entry<Character, Integer> a, Map.Entry<Character, Integer> b) {
return b.getValue() - a.getValue();
}
});
maxHeap.addAll(map.entrySet());
Queue<Map.Entry<Character, Integer>> waitQueue = new LinkedList<>();
while (!maxHeap.isEmpty()) {
Map.Entry<Character, Integer> current = maxHeap.poll();
res.append(current.getKey());
current.setValue(current.getValue() - 1);
waitQueue.offer(current);
if (waitQueue.size() >= k) {
Map.Entry<Character, Integer> previous = waitQueue.poll();
if (previous.getValue() > 0) {
maxHeap.offer(previous);
}
}
}
return res.length() == s.length() ? res.toString() : "";
}
}