wordsearch/anagram/anagram.go

48 lines
744 B
Go

package anagram
import (
"bufio"
"io"
"sort"
"github.com/ray1729/wordsearch/util"
)
type DB interface {
FindAnagrams(s string) []string
Add(s string)
}
type HashDBImpl map[string][]string
func New() HashDBImpl {
return make(HashDBImpl)
}
func (db HashDBImpl) Add(s string) {
k := toKey(s)
db[k] = append(db[k], s)
}
func toKey(s string) string {
xs := util.LowerCaseAlpha(s)
sort.Slice(xs, func(i, j int) bool { return xs[i] < xs[j] })
return string(xs)
}
func Load(r io.Reader) (DB, error) {
db := New()
sc := bufio.NewScanner(r)
for sc.Scan() {
db.Add(sc.Text())
}
if err := sc.Err(); err != nil {
return nil, err
}
return db, nil
}
func (d HashDBImpl) FindAnagrams(s string) []string {
return d[toKey(s)]
}