feat: group anagrams
This commit is contained in:
41
pkg/group_anagrams/main.go
Normal file
41
pkg/group_anagrams/main.go
Normal file
@@ -0,0 +1,41 @@
|
||||
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
|
||||
}
|
||||
14
pkg/group_anagrams/main_test.go
Normal file
14
pkg/group_anagrams/main_test.go
Normal file
@@ -0,0 +1,14 @@
|
||||
package group_anagrams_test
|
||||
|
||||
// import (
|
||||
// "testing"
|
||||
|
||||
// . "git.maximhutz.com/practice/pkg/group_anagrams"
|
||||
// "github.com/stretchr/testify/assert"
|
||||
// )
|
||||
|
||||
// func Test1(t *testing.T) {
|
||||
// assert.Equal(t,
|
||||
// [][]string{{"bat"}, {"nat", "tan"}, {"ate", "eat", "tea"}},
|
||||
// GroupAnagrams([]string{"eat", "tea", "tan", "ate", "nat", "bat"}))
|
||||
// }
|
||||
Reference in New Issue
Block a user