How to display string letters sorted by frequency in Go

1 Answer

0 votes
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

*/

 



answered 2 days ago by avibootz

Related questions

...