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