LeetCode 451. Sort Characters By Frequency

  • Post author:
  • Post category:其他

原题网址: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.

方法:桶排序

public class Solution {
    private int[] frequency(char[] sa) {
        int[] counts = new int[256];
        for(int i = 0; i < sa.length; i++) {
            counts[sa[i]]++;
        }
        return counts;
    }
    public String frequencySort(String s) {
        char[] sa = s.toCharArray();
        int[] f = frequency(sa);
        Map<Integer, StringBuilder> inverse = new HashMap<>();
        for(int i = 0; i < f.length; i++) {
            if (f[i] > 0) {
                StringBuilder sb = inverse.get(f[i]);
                if (sb == null) {
                    sb = new StringBuilder();
                    inverse.put(f[i], sb);
                }
                sb.append((char)i);
            }
        }
        char[] sorted = new char[sa.length];
        for(int i = sa.length, pos = 0; i > 0; i--) {
            StringBuilder sb = inverse.get(i);
            if (sb == null) continue;
            for(int j = 0; j < sb.length(); j++) {
                char ch = sb.charAt(j);
                for(int k = 0; k < i; k++) {
                    sorted[pos++] = ch;
                }
            }
        }
        return new String(sorted);
    }
}


版权声明:本文为jmspan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。