structtrierNode{trierNode*child[26];boolisEnd;trierNode(){for(inti=0;i<26;i++){child[i]=nullptr;}isEnd=false;}};classtrier{public:trierNode*root;public:trier(){root=newtrierNode;}~trier(){// 后续遍历析构
delhelp(root);}voidaddWord(stringword){trierNode*cur=root;for(auto&c:word){if(cur->child[c-'a']==nullptr){cur->child[c-'a']=newtrierNode;}cur=cur->child[c-'a'];}cur->isEnd=true;}boolsearch(stringword){trierNode*cur=root;returndfs(cur,word,0);}private:booldfs(trierNode*node,string&word,intidx){if(node==nullptr){returnfalse;}if(idx>=word.size()){returnnode->isEnd;}if(word[idx]=='.'){for(inti=0;i<26;i++){if(dfs(node->child[i],word,idx+1)){returntrue;}}}else{returndfs(node->child[word[idx]-'a'],word,idx+1);}returnfalse;}voiddelhelp(trierNode*node){if(node==nullptr){return;}for(inti=0;i<26;i++){delhelp(node->child[i]);}deletenode;}};classWordDictionary{public:trier*mt;WordDictionary(){mt=newtrier;}~WordDictionary(){deletemt;}voidaddWord(stringword){mt->addWord(word);}boolsearch(stringword){returnmt->search(word);}};/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary* obj = new WordDictionary();
* obj->addWord(word);
* bool param_2 = obj->search(word);
*/