42 lines
683 B
Go
42 lines
683 B
Go
package group_anagrams
|
|
|
|
import (
|
|
"hash/maphash"
|
|
"slices"
|
|
)
|
|
|
|
func SortString(s string) string {
|
|
runes := []rune(s)
|
|
slices.Sort(runes)
|
|
return string(runes)
|
|
}
|
|
|
|
func AnagramHash(letters string) uint64 {
|
|
var h maphash.Hash
|
|
h.WriteString(SortString(letters))
|
|
return h.Sum64()
|
|
}
|
|
|
|
func GroupAnagrams(items []string) [][]string {
|
|
anagrams := map[uint64][]string{}
|
|
|
|
for _, item := range items {
|
|
hash := AnagramHash(item)
|
|
similar, exists := anagrams[hash]
|
|
|
|
if exists {
|
|
anagrams[hash] = append(similar, item)
|
|
} else {
|
|
anagrams[hash] = []string{item}
|
|
}
|
|
}
|
|
|
|
result := [][]string{}
|
|
|
|
for _, group := range anagrams {
|
|
result = append(result, group)
|
|
}
|
|
|
|
return result
|
|
}
|