|
@@ -0,0 +1,68 @@
|
|
|
+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);
|
|
|
+ */
|