原题链接在这里:https://leetcode.com/problems/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.
题解:
类似Top K Frequent Elements. 利用Bucket Sort 按照频率把s的char放进bucket里, 再按照频率从大到小,重复频率次append到res中.
Time Complexity: O(n), n = s.length(). Space: O(n).
AC Java:
1 public class Solution { 2 public String frequencySort(String s) { 3 if(s == null || s.length() == 0){ 4 return s; 5 } 6 7 HashMap<Character, Integer> freqMap = new HashMap<Character, Integer>(); 8 for(char c : s.toCharArray()){ 9 freqMap.put(c, freqMap.getOrDefault(c, 0)+1); 10 } 11 12 StringBuilder [] bucket = new StringBuilder[s.length()+1]; 13 for(char c : freqMap.keySet()){ 14 int freq = freqMap.get(c); 15 if(bucket[freq] == null){ 16 bucket[freq] = new StringBuilder(); 17 } 18 for(int i = 0; i<freq; i++){ 19 bucket[freq].append(c); 20 } 21 } 22 23 StringBuilder res = new StringBuilder(); 24 for(int i = bucket.length-1; i>=0; i--){ 25 if(bucket[i] != null){ 26 res.append(bucket[i]); 27 } 28 } 29 return res.toString(); 30 } 31 }