1. 程式人生 > 其它 >211. 新增與搜尋單詞 - 資料結構設計(trie 樹)

211. 新增與搜尋單詞 - 資料結構設計(trie 樹)

 

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); */