use std::cmp::Reverse;
use std::collections::BTreeMap;

impl Solution {
    pub fn frequency_sort(s: String) -> String {
        let mut freqs: BTreeMap<_, usize> = BTreeMap::new();

        s.as_str().chars().for_each(|c| {
            let current = freqs.get(&c).unwrap_or(&0);
            freqs.insert(c, 1 + current);
        });

        let mut frequencies: Vec<_> = freqs.iter().collect();
        frequencies.sort_by_key(|&(_, count)| Reverse(count));

        frequencies.iter().fold(String::new(), |s, (c, count)| {
            s + &c.to_string().repeat(**count)
        })
    }
}