-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprogram.go
72 lines (61 loc) · 1.86 KB
/
program.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package main
import (
"sort"
"strings"
"slices"
)
// Clean the input (edge cases)
func filterAndValidateWord(inputString string) string {
inputString = strings.TrimSpace(inputString)
inputString = strings.ToLower(inputString)
return inputString
}
// Sort the inputString
func sortString(inputString string) string {
inputBytes := []byte(inputString)
sort.SliceStable(inputBytes, func(i, j int) bool {
return inputBytes[i] < inputBytes[j]
})
return string(inputBytes)
}
// List anagrams in map
func listAllAnagramsInMap(wordList []string) map[string][]string {
mapOfSliceOfString := make(map[string][]string, len(wordList))
for _, word := range wordList {
word = filterAndValidateWord(word)
sortedWord := sortString(word)
// Check if the word-key already exists in map
if existingSlice, found := mapOfSliceOfString[sortedWord]; found {
mapOfSliceOfString[sortedWord] = append(existingSlice, word)
slices.Sort(mapOfSliceOfString[sortedWord])
continue
}
// Instantiate a slice with word
mapOfSliceOfString[sortedWord] = []string{word}
}
return mapOfSliceOfString
}
// Sort map and return the sorted keys
func getsortedMapKeys(inputMap map[string][]string) []string {
keys := make([]string, 0, len(inputMap))
for key := range inputMap {
keys = append(keys, key)
}
slices.Sort(keys)
return keys
}
// Convert map[string] to slice
func convertMapToSlice(inputMap map[string][]string) [][]string {
keys := getsortedMapKeys(inputMap)
outputSlice := make([][]string, 0, len(keys))
for _, key := range keys {
outputSlice = append(outputSlice, inputMap[key])
}
return outputSlice
}
// Input a slice of words and return the list of words, bunched together
// if they are made up of same characters of string
func ListAllAnagramsInSlice(wordList []string) [][]string {
anagramMap := listAllAnagramsInMap(wordList)
return convertMapToSlice(anagramMap)
}