How to display string letters sorted by frequency in Rust

1 Answer

0 votes
use std::fmt;

// Pair structure: (letter, frequency)
struct Pair {
    letter: char,
    freq: usize,
}

// Implement Display so printing pairs is easy
impl fmt::Display for Pair {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}: {}", self.letter, self.freq)
    }
}

// sortByFrequency — counts how often each letter appears and returns a sorted list
fn sort_by_frequency(s: &str) -> Vec<Pair> {
    // Create a frequency array for 26 lowercase letters, initialized to 0
    let mut freq = vec![0usize; 26];

    // Iterate through the string and count only alphabetic characters
    for c in s.chars() {
        if c.is_alphabetic() {
            let lower = c.to_ascii_lowercase();
            let idx = (lower as u8 - b'a') as usize;
            freq[idx] += 1;
        }
    }

    // Build a vector of (letter, frequency) pairs
    let mut result: Vec<Pair> = (0..26)
        .map(|i| Pair {
            letter: (b'a' + i as u8) as char,
            freq: freq[i],
        })
        .collect();

    // Sort pairs by frequency in descending order
    result.sort_by(|a, b| b.freq.cmp(&a.freq));

    result
}

// Build a string sorted by frequency: ddddddddddddccccccbbbbbaaaafffeehhgs
fn build_sorted_string(sorted: &[Pair]) -> String {
    let mut out = String::new();

    for p in sorted {
        // append 'p.letter' repeated p.freq times
        if p.freq > 0 {
            out.push_str(&p.letter.to_string().repeat(p.freq));
        }
    }

    out
}

fn main() {
    // Input text to analyze
    let text = "bbcabddddccafffadbbcdccsedddddhhgade";

    // Get sorted frequency list
    let sorted = sort_by_frequency(text);

    // Print each letter and its frequency
    for p in &sorted {
        if p.freq != 0 {
            println!("{}", p);
        }
    }

    // Print the reconstructed sorted string
    let letters_sorted_by_frequency = build_sorted_string(&sorted);
    println!("\nSorted string: {}", letters_sorted_by_frequency);
}


/*
run:

d: 12
c: 6
b: 5
a: 4
f: 3
e: 2
h: 2
g: 1
s: 1

Sorted string: ddddddddddddccccccbbbbbaaaafffeehhgs

*/

 



answered 2 days ago by avibootz

Related questions

...