Leetcode - Rearrange String k Distance Apart

My code:

public class Solution {
    public String rearrangeString(String str, int k) {
        if (str == null) {
            return "";
        }
        else if (k <= 1) {
            return str;
        }
        
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (!map.containsKey(c)) {
                map.put(c, 1);
            }
            else {
                map.put(c, map.get(c) + 1);
            }
        }
        
        PriorityQueue<Character> pq = new PriorityQueue<Character>(10, new Comparator<Character>() {
            public int compare(Character c1, Character c2) {
                if (map.get(c1).compareTo(map.get(c2)) != 0) {
                    return map.get(c2) - map.get(c1);
                }
                else {
                    return c1.compareTo(c2);
                }
            }    
        });
        
        for (Character c : map.keySet()) {
            pq.offer(c);
        }
        
        StringBuilder sb = new StringBuilder();
        int len = str.length();
        while (!pq.isEmpty()) {
            int cnt = Math.min(k, len);
            List<Character> temp = new ArrayList<Character>();
            for (int i = 0; i < cnt; i++) {
                if (pq.isEmpty()) {
                    return "";
                }
                char curr = pq.poll();
                sb.append(curr);
                map.put(curr, map.get(curr) - 1);
                len--;
                if (map.get(curr) > 0) {
                    temp.add(curr);
                }
            }
            for (Character c : temp) {
                pq.offer(c);
            }
        }
        
        return sb.toString();
    }
}

reference:
http://www.programcreek.com/2014/08/leetcode-rearrange-string-k-distance-apart-java/

这道题目直接看的答案,用的
PriorityQueue + HashMap

pq 的优先级是,出现频率越大的字母,优先级越高。

然后我把所有字母插入pq,相同字母只插入一次。
第一次,按照距离至少是k来插入。
所以 cnt = Math.min(k, len);

然后把除了出现这次外,还会出现的字母,再次插入到queue中
以此类推。

Anyway, Good luck, Richardo! — 10/09/2016

    原文作者:Richardo92
    原文地址: https://www.jianshu.com/p/21274c38fb05
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞