BiruLyu
7/26/2017 - 1:43 AM

358. Rearrange String k Distance Apart(#Heap).java

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() : "";
    }
}