text: # Time:  O(n)
  # Space: O(n)
  
  # 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.
  
  import collections
  
  
  class Solution(object):
      def frequencySort(self, s):
          """
          :type s: str
          :rtype: str
          """
          freq = collections.defaultdict(int)
          for c in s:
              freq[c] += 1
  
          counts = [""] * (len(s)+1)
          for c in freq:
              counts[freq[c]] += c
  
          result = ""
          for count in reversed(xrange(len(counts)-1)):
              for c in counts[count]:
                  result += c * count
  
          return result
  