LeetCode 451. Sort Characters By Frequency
原题链接在这里: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中.
Note: When add bucket element to result. Do not forget to check if this element is null or not.
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 }
AC C++:
1 class Solution { 2 public: 3 string frequencySort(string s) { 4 unordered_map<char, int> map; 5 for(char c : s){ 6 map[c]++; 7 } 8 9 int n = s.size(); 10 vector<vector<char>> bucket(n + 1); 11 for(auto [c, f] : map){ 12 bucket[f].push_back(c); 13 } 14 15 string res; 16 for(int i = n; i>=0; i--){ 17 for(char c : bucket[i]){ 18 res.append(i, c); 19 } 20 } 21 22 return res; 23 } 24 };
AC Python:
1 class Solution: 2 def frequencySort(self, s: str) -> str: 3 map = Counter(s) 4 n = len(s) 5 bucket = [[] for _ in range(n + 1)] 6 for c, freq in map.items(): 7 bucket[freq].append(c) 8 9 res = [] 10 for freq in range(n, 0, -1): 11 for c in bucket[freq]: 12 res.append(c * freq) 13 14 return "".join(res)