1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- type trie struct {
- word bool
- next [26]*trie
- }
- func (t *trie) insert(s string) {
- for _, r := range s {
- i := r - 'a'
- if t.next[i] == nil {
- t.next[i] = &trie{}
- }
- t = t.next[i]
- }
- t.word = true
- }
- func (t *trie) search(s string) *trie {
- res := t
- for _, r := range s {
- res = res.next[r-'a']
- if res == nil {
- break
- }
- }
- return res
- }
- type MagicDictionary struct {
- tree trie
- }
- /** Initialize your data structure here. */
- func Constructor() MagicDictionary {
- return MagicDictionary{}
- }
- /** Build a dictionary through a list of words */
- func (this *MagicDictionary) BuildDict(dict []string) {
- for _, s := range dict {
- this.tree.insert(s)
- }
- }
- /** Returns if there is any word in the trie that equals to the given word after modifying exactly one character */
- func (this *MagicDictionary) Search(word string) bool {
- for i := range word {
- t := this.tree.search(word[:i])
- if t == nil {
- continue
- }
- for j := 0; j < 26; j++ {
- if j == int(word[i]-'a') || t.next[j] == nil {
- continue
- }
- if s := t.next[j].search(word[i+1:]); s != nil && s.word {
- return true
- }
- }
- }
- return false
- }
- /**
- * Your MagicDictionary object will be instantiated and called as such:
- * obj := Constructor();
- * obj.BuildDict(dict);
- * param_2 := obj.Search(word);
- */
|