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
*/