451. Sort Characters By Frequency

Problem:
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.
Analysis:
Bucket sort......

Solution:
class Solution {
    public String frequencySort(String s) {
        String res = "";
        StringBuilder sb = new StringBuilder();
        if (s == null || s.length() == 0) return res;
        Map<Character, Integer> map = new HashMap<>();
        List<Character>[] bucket = new List[s.length() + 1];
        
        for (char c: s.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }

        // get distinct numbers
        for (char c: map.keySet()) {    
            int frequency = map.get(c);
            if (bucket[frequency] == null) {
                bucket[frequency] = new ArrayList<>();
            }
            bucket[frequency].add(c);
        }

        for (int i = bucket.length - 1; i > 0; i--) {
            if (bucket[i] != null) {
                for (int j = 0; j < bucket[i].size(); j++) {
                    for (int q = 0; q < i; q++) {
                        sb.append(bucket[i].get(j));    
                    }
                }
            }
        }

        return sb.toString();
    }
}

评论

此博客中的热门博文

663. Equal Tree Partition

776. Split BST

426. Convert Binary Search Tree to Sored Doubly Linked List