211. 新增與搜尋單詞 - 資料結構設計(trie 樹)
阿新 • • 發佈:2022-06-01
labuladong 題解 難度中等
請你設計一個數據結構,支援 新增新單詞 和 查詢字串是否與任何先前新增的字串匹配 。
實現詞典類 WordDictionary
:
-
WordDictionary()
初始化詞典物件 -
void addWord(word)
將word
新增到資料結構中,之後可以對它進行匹配 -
bool search(word)
如果資料結構中存在字串與word
匹配,則返回true
;否則,返回false
。word
中可能包含一些'.'
,每個.
都可以表示任何一個字母。
示例:
輸入: ["WordDictionary","addWord","addWord","addWord","search","search","search","search"] [[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]] 輸出: [null,null,null,null,false,true,true,true] 解釋: WordDictionary wordDictionary = new WordDictionary(); wordDictionary.addWord("bad"); wordDictionary.addWord("dad"); wordDictionary.addWord("mad"); wordDictionary.search("pad"); // 返回 False wordDictionary.search("bad"); // 返回 True wordDictionary.search(".ad"); // 返回 True wordDictionary.search("b.."); // 返回 True
struct TrieNode { bool is_end; std::vector<TrieNode*> children; TrieNode() { is_end = false; children = std::vector<TrieNode*>(26); } }; class WordDictionary { TrieNode* root; public: WordDictionary() { root = new TrieNode(); }void addWord(string word) { TrieNode* node = root; for(auto ch : word) { if (node->children[ch-'a'] == nullptr) { node->children[ch-'a'] = new TrieNode(); } node = node->children[ch - 'a']; } node->is_end = true; } bool dfs(string word, int index, TrieNode* root) { if (index >= word.size()){ return root->is_end; } auto ch = word[index]; if (ch == '.') { for(int i = 0; i < 26;i++) { TrieNode * node = root->children[i]; if (node!=nullptr && dfs(word,index+1,node)) { return true; } } } else if ('a' <= ch && ch <='z') { TrieNode* node = root->children[ch-'a']; if (node!=nullptr && dfs(word,index+1,node)) { return true; } } return false; } bool search(string word) { return dfs(word,0,root); } }; /** * Your WordDictionary object will be instantiated and called as such: * WordDictionary* obj = new WordDictionary(); * obj->addWord(word); * bool param_2 = obj->search(word); */