type WordDictionary struct { root *trie } func Constructor() WordDictionary { return WordDictionary{new(trie)} } func (this *WordDictionary) AddWord(word string) { this.root.insert(word) } func (this *WordDictionary) Search(word string) bool { n := len(word) var dfs func(int, *trie) bool dfs = func(i int, cur *trie) bool { if i == n { return cur.isEnd } c := word[i] if c != '.' { child := cur.children[c-'a'] if child != nil && dfs(i+1, child) { return true } } else { for _, child := range cur.children { if child != nil && dfs(i+1, child) { return true } } } return false } return dfs(0, this.root) } type trie struct { children [26]*trie isEnd bool } func (t *trie) insert(word string) { cur := t for _, c := range word { c -= 'a' if cur.children[c] == nil { cur.children[c] = new(trie) } cur = cur.children[c] } cur.isEnd = true } /** * Your WordDictionary object will be instantiated and called as such: * obj := Constructor(); * obj.AddWord(word); * param_2 := obj.Search(word); */