Вход: "дерево"
Выход: "eert"
Объяснение: «e» появляется дважды, а «r» и «t» - один раз. Таким образом, "e" должно стоять перед "r" и "t". Следовательно, "eetr" тоже правильный ответ.
Я пробовал примерно так:
class Solution(object):
def frequencySort(self, s):
"""
:type s: str
:rtype: str
"""
has = dict()
l = list()
for c in s:
if c not in has:
has[c] = 1
else:
has[c] += 1
for k in sorted(has,key = has.get, reverse = True):
for i in range(has[k]):
l.extend(k)
return ("".join(l))
но его O (n * m) n = длина строки, m = максимальное вхождение символа
Как я могу улучшить это до порядка n?
sorted(s, key=Counter(s).get, reverse=True) тоже работает.






Есть ли причина, по которой вы не можете использовать встроенную сортировку с лямбда-ключом?
>>> a = 'aabbbcccccd'
>>> sorted(a, key=lambda c: a.count(c))
['d', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c']
>>> sorted(a, key=lambda c: a.count(c), reverse=True)
['c', 'c', 'c', 'c', 'c', 'b', 'b', 'b', 'a', 'a', 'd']
>>> ''.join(sorted(a, key=lambda c: a.count(c), reverse=True))
'cccccbbbaad'
Я считаю, что методы сортировки python - это O(n log n), но count сделает этот O(n^2)
Я думаю, что это О (п ^ 2), поскольку count должен пройти весь список для каждого символа.
@EastonBornemeier Вы забываете о звонках a.count(c).
Вы правы @Prune. Есть ли способ сделать это быстрее?
может быть
return ''.join(c * t for c, t in collections.Counter(s).most_common())bookshadow.com/weblog/2016/11/02/…