• 451. Sort Characters By Frequency


    Given a string, sort it in decreasing order based on the frequency of characters.

    Example 1:

    Input:
    "tree"
    
    Output:
    "eert"
    
    Explanation:
    'e' appears twice while 'r' and 't' both appear once.
    So 'e' must appear before both 'r' and 't'. Therefore "eetr" is also a valid answer.

    Example 2:

    Input:
    "cccaaa"
    
    Output:
    "cccaaa"
    
    Explanation:
    Both 'c' and 'a' appear three times, so "aaaccc" is also a valid answer.
    Note that "cacaca" is incorrect, as the same characters must be together.

    Example 3:

    Input:
    "Aabb"
    
    Output:
    "bbAa"
    
    Explanation:
    "bbaA" is also a valid answer, but "Aabb" is incorrect.
    Note that 'A' and 'a' are treated as two different characters.

    首先用hashmap扫一遍string,统计频率。按频率排序,将hashmap的entry存入max heap,再一个个poll出来,append到StringBuilder

    时间:O(NlogN),空间:O(N)

    class Solution {
        public String frequencySort(String s) {
            HashMap<Character, Integer> map = new HashMap<>();
            PriorityQueue<Map.Entry<Character, Integer>> maxHeap = new PriorityQueue<>((a, b) -> (b.getValue() - a.getValue()));
            
            for(char c : s.toCharArray()) {
                map.put(c, map.getOrDefault(c, 0) + 1);
            }
            
            for(Map.Entry<Character, Integer> entry : map.entrySet()) {
                maxHeap.offer(entry);
            }
            
            StringBuilder sb = new StringBuilder();
            while(!maxHeap.isEmpty()) {
                Map.Entry<Character, Integer> tmp = maxHeap.poll();
                for(int j = 0; j < tmp.getValue(); j++)
                    sb.append(tmp.getKey());
            }
            return sb.toString();
        }
    }
    class Solution {
        public String frequencySort(String s) {
            Map<Character, Integer> map = new HashMap<>();
            for(int i = 0; i < s.length(); i++) {
                map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
            }
            
            PriorityQueue<Map.Entry<Character, Integer>> maxHeap = new PriorityQueue<>((a, b) -> b.getValue() - a.getValue());
            maxHeap.addAll(map.entrySet());
            
            StringBuilder sb = new StringBuilder();
            while(!maxHeap.isEmpty()) {
                Map.Entry<Character, Integer> entry = maxHeap.poll();
                for(int i = 0; i < entry.getValue(); i++)
                    sb.append(entry.getKey());
            }
            return sb.toString();
        }
    }
  • 相关阅读:
    map-count
    map-count
    map-constructors
    map-constructors
    multiset-find
    multiset-find
    multiset-insert
    C++ string详解
    treap(树堆)
    程序设计语言的变革
  • 原文地址:https://www.cnblogs.com/fatttcat/p/9988434.html
Copyright © 2020-2023  润新知