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

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

题目描述

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例 1:
输入:
“tree”
输出:
“eert”
解释:
‘e’出现两次,’r’和’t’都只出现一次。
因此’e’必须出现在’r’和’t’之前。此外,”eetr”也是一个有效的答案。

示例 2:
输入:
“cccaaa”
输出:
“cccaaa”
解释:
‘c’和’a’都出现三次。此外,”aaaccc”也是有效的答案。
注意”cacaca”是不正确的,因为相同的字母必须放在一起。

示例 3:
输入:
“Aabb”
输出:
“bbAa”
解释:
此外,”bbaA”也是一个有效的答案,但”Aabb”是不正确的。
注意’A’和’a’被认为是两种不同的字符。

题目地址

中文版

英文版

 

代码实现


class Solution(object):
    def frequencySort(self, s):
        """
        :type s: str
        :rtype: str
        """
        if(not s):
            return s
        word_2_num = dict()    # word(key) -> count(value)
        num_2_word = dict() # count(key) -> word(value)
        res = ""
        for i in s:
            if(i not in word_2_num):
                word_2_num[i] = 1
            else:
                word_2_num[i] += 1
        for key in word_2_num.keys():
            num = word_2_num[key]
            if( num not in num_2_word):
                num_2_word[num] = [key]
            else:
                num_2_word[num].append(key)
        
        #iter num_2_word dict
        #print word_2_num
        #print num_2_word
        nums = sorted( num_2_word.keys() )
        for i in xrange(len(nums)-1,-1,-1):
            # get num_2_word -> value, value is list,like [a,b,c...]   
            arr = num_2_word[nums[i]]  
            for c in arr:
                res += c*nums[i]
        return res
                                                                                              

 

一种更精简的实现

class Solution(object):
    def frequencySort(self, s):
        """
        :type s: str
        :rtype: str
        """
        stc={}
        res=''
        for i in s:
            if i in stc:
                stc[i]+=1
            else:
                stc[i]=1
        for k in sorted(stc,key=stc.__getitem__,reverse=True):
            res+=k*stc[k]
        return res
                                                                   
4 次阅读

发表评论

电子邮件地址不会被公开。