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) { HashMapmap = new HashMap<>(); PriorityQueue > 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 entry : map.entrySet()) { maxHeap.offer(entry); } StringBuilder sb = new StringBuilder(); while(!maxHeap.isEmpty()) { Map.Entry 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) { Mapmap = new HashMap<>(); for(int i = 0; i < s.length(); i++) { map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1); } PriorityQueue > maxHeap = new PriorityQueue<>((a, b) -> b.getValue() - a.getValue()); maxHeap.addAll(map.entrySet()); StringBuilder sb = new StringBuilder(); while(!maxHeap.isEmpty()) { Map.Entry entry = maxHeap.poll(); for(int i = 0; i < entry.getValue(); i++) sb.append(entry.getKey()); } return sb.toString(); }}