程式語言 - LeetCode - C++ - 211. Design Add and Search Words Data Structure



題目:


解答:

class WordDictionary {
private:
    struct TrieNode {
        bool is_end;
        TrieNode *child[26];

        TrieNode() {
            is_end = false;
            for (int i = 0; i < 26; ++i) {
                child[i] = nullptr;
            }
        }
    };

    TrieNode* root;

public:
    WordDictionary() {
        root = new TrieNode();
    }
    
    void addWord(string word) {
        TrieNode *n = root;

        for (char ch : word) {
            if (!n->child[ch - 'a']) {
                n->child[ch - 'a'] = new TrieNode();
            }
            n = n->child[ch - 'a'];
        }
        n->is_end = true;
    }
    
    bool search(string word) {
        return dfs(word, 0, root);
    }

    bool dfs(string& word, int i, TrieNode *n) {
        if (!n) {
            return false;
        }

        if (i == word.size()) {
            return n->is_end;
        }

        char ch = word[i];

        if (ch == '.') {
            for (int j = 0; j < 26; j++) {
                if (dfs(word, i + 1, n->child[j])) {
                    return true;
                }
            }
        }
        else {
            return dfs(word, i + 1, n->child[ch - 'a']);
        }

        return false;
    }
};

/**
 * Your WordDictionary object will be instantiated and called as such:
 * WordDictionary* obj = new WordDictionary();
 * obj->addWord(word);
 * bool param_2 = obj->search(word);
 */