package main
import (
"fmt"
"sort"
"strings"
"unicode"
)
// Pair structure: (letter, frequency)
type Pair struct {
Letter rune
Freq int
}
// sortByFrequency — counts how often each letter appears and returns a sorted list
func sortByFrequency(s string) []Pair {
// Create a frequency array for 26 lowercase letters, initialized to 0
freq := make([]int, 26)
// Iterate through the string and count only alphabetic characters
for _, c := range s {
if unicode.IsLetter(c) {
lower := unicode.ToLower(c)
freq[int(lower-'a')]++
}
}
// Build a slice of (letter, frequency) pairs
result := make([]Pair, 26)
for i := 0; i < 26; i++ {
result[i] = Pair{
Letter: rune('a' + i),
Freq: freq[i],
}
}
// Sort pairs by frequency in descending order
sort.Slice(result, func(i, j int) bool {
return result[i].Freq > result[j].Freq
})
return result
}
// Build a string sorted by frequency: ddddddddddddccccccbbbbbaaaafffeehhgs
func buildSortedString(sorted []Pair) string {
var out strings.Builder
for _, p := range sorted {
// append 'p.Letter' repeated p.Freq times
if p.Freq > 0 {
out.WriteString(strings.Repeat(string(p.Letter), p.Freq))
}
}
return out.String()
}
func main() {
// Input text to analyze
text := "bbcabddddccafffadbbcdccsedddddhhgade"
// Get sorted frequency list
sorted := sortByFrequency(text)
// Print each letter and its frequency
for _, p := range sorted {
if p.Freq != 0 {
fmt.Printf("%c: %d\n", p.Letter, p.Freq)
}
}
// Print the reconstructed sorted string
lettersSortedByFrequency := buildSortedString(sorted)
fmt.Println("\nSorted string:", lettersSortedByFrequency)
}
/*
run:
d: 12
c: 6
b: 5
a: 4
f: 3
e: 2
h: 2
g: 1
s: 1
Sorted string: ddddddddddddccccccbbbbbaaaafffeehhgs
*/