2023-10-07 17:12:47 +01:00
|
|
|
package anagram
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"io"
|
|
|
|
"sort"
|
|
|
|
|
2023-10-08 15:05:12 +01:00
|
|
|
"github.com/ray1729/wordsearch/util"
|
2023-10-07 17:12:47 +01:00
|
|
|
)
|
|
|
|
|
2023-10-09 09:09:28 +01:00
|
|
|
type DB map[string][]string
|
2023-10-08 14:25:57 +01:00
|
|
|
|
2023-10-09 09:09:28 +01:00
|
|
|
func New() DB {
|
|
|
|
return make(DB)
|
2023-10-08 14:25:57 +01:00
|
|
|
}
|
|
|
|
|
2023-10-09 09:09:28 +01:00
|
|
|
func (db DB) Add(s string) {
|
2023-10-08 14:25:57 +01:00
|
|
|
k := toKey(s)
|
|
|
|
db[k] = append(db[k], s)
|
2023-10-07 17:12:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
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) {
|
2023-10-08 14:25:57 +01:00
|
|
|
db := New()
|
2023-10-07 17:12:47 +01:00
|
|
|
sc := bufio.NewScanner(r)
|
|
|
|
for sc.Scan() {
|
2023-10-08 14:25:57 +01:00
|
|
|
db.Add(sc.Text())
|
2023-10-07 17:12:47 +01:00
|
|
|
|
|
|
|
}
|
2023-10-09 09:09:28 +01:00
|
|
|
return db, sc.Err()
|
2023-10-07 17:12:47 +01:00
|
|
|
}
|
|
|
|
|
2023-10-09 09:09:28 +01:00
|
|
|
func (d DB) FindAnagrams(s string) []string {
|
2023-10-07 17:12:47 +01:00
|
|
|
return d[toKey(s)]
|
|
|
|
}
|