leetcode中等451根据字符出现频率排序

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等451根据字符出现频率排序相关的知识,希望对你有一定的参考价值。


思路:桶排序

  1. 遍历字符串,统计每个字符出现的频率,同时记录最高频率 maxFreq;
  2. 创建桶,存储从 1 到 maxFreq 的每个出现频率的字符;
  3. 按照出现频率从大到小的顺序遍历桶,对于每个出现频率,获得对应的字符,然后将每个字符按照出现频率拼接到排序后的字符串。

时间复杂度:O(n + k),其中 n 是字符串 s 的长度,k 是字符串 s 包含的不同字符的个数。
遍历字符串统计每个字符出现的频率需要 O(n) 的时间。
创建桶并将不同字符加入桶需要 O(k) 的时间。
生成排序后的字符串,需要 O(k) 的时间遍历桶,以及 O(n) 的时拼接字符串间。
因此总时间复杂度是 O(n + k)。

空间复杂度:O(n + k),其中 n 是字符串 s 的长度,k 是字符串 s 包含的不同字符的个数。空间复杂度主要取决于桶和生成的排序后的字符串。

class Solution 
    public String frequencySort(String s) 
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        int maxFreq = 0;
        int length = s.length();
        for (int i = 0; i < length; i++) 
            char c = s.charAt(i);
            int frequency = map.getOrDefault(c, 0) + 1;
            map.put(c, frequency);
            maxFreq = Math.max(maxFreq, frequency);
        
        StringBuffer[] buckets = new StringBuffer[maxFreq + 1];
        for (int i = 0; i <= maxFreq; i++) 
            buckets[i] = new StringBuffer();
        
        for (Map.Entry<Character, Integer> entry : map.entrySet()) 
            char c = entry.getKey();
            int frequency = entry.getValue();
            buckets[frequency].append(c);
        
        StringBuffer sb = new StringBuffer();
        for (int i = maxFreq; i > 0; i--) 
            StringBuffer bucket = buckets[i];
            int size = bucket.length();
            for (int j = 0; j < size; j++) 
                for (int k = 0; k < i; k++) 
                    sb.append(bucket.charAt(j));
                
            
        
        return sb.toString();
    

以上是关于leetcode中等451根据字符出现频率排序的主要内容,如果未能解决你的问题,请参考以下文章

leetcode中等451根据字符出现频率排序

LeetCode 451 根据字符出现频率排序

LeetCode Algorithm 451. 根据字符出现频率排序

Leetcode 451.根据字符出现频率排序

leetcode.排序.451根据字符出现频率排序-Java

leetcode No451_根据字符出现频率排序