diff --git a/pkg/group_anagrams/main.go b/pkg/group_anagrams/main.go new file mode 100644 index 0000000..d5d2916 --- /dev/null +++ b/pkg/group_anagrams/main.go @@ -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 +} diff --git a/pkg/group_anagrams/main_test.go b/pkg/group_anagrams/main_test.go new file mode 100644 index 0000000..9b5515f --- /dev/null +++ b/pkg/group_anagrams/main_test.go @@ -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"})) +// }