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)

类似Top K Frequent WordsFirst Unique Character in a String.

posted @ 2017-02-03 09:07  Dylan_Java_NYC  阅读(414)  评论(0编辑  收藏  举报