1. 程式人生 > >【LeetCode】211. 新增與搜尋單詞

【LeetCode】211. 新增與搜尋單詞

題目描述:

設計一個支援以下兩種操作的資料結構:

void addWord(word) bool search(word) search(word) 可以搜尋文字或正則表示式字串,字串只包含字母 . 或 a-z 。 . 可以表示任何一個字母。

示例:

addWord("bad") addWord("dad") addWord("mad") search("pad") -> false search("bad") -> true search(".ad") -> true search("b..") -> true 說明:

你可以假設所有單詞都是由小寫字母 a-z 組成的。

解題方案:

一點都不想寫題,看著都想要吐。。。

程式碼:

class WordDictionary {
public:
    struct TrieNode {
    public:
        TrieNode *child[26];
        bool isWord;
        TrieNode() : isWord(false) {
            for (auto &a : child) a = NULL;
        }
    };
    
    WordDictionary() {
        root = new TrieNode();
    }
    // Adds a word into the data structure.
    void addWord(string word) {
        TrieNode *p = root;
        for (auto &a : word) {
            int i = a - 'a';
            if (!p->child[i]) p->child[i] = new TrieNode();
            p = p->child[i];
        }
        p->isWord = true;
    }
    // Returns if the word is in the data structure. A word could
    // contain the dot character '.' to represent any one letter.
    bool search(string word) {
        return searchWord(word, root, 0);
    }
    bool searchWord(string &word, TrieNode *p, int i) {
        if (i == word.size()) return p->isWord;
        if (word[i] == '.') {
            for (auto &a : p->child) {
                if (a && searchWord(word, a, i+1)) 
                    return true;
            }
            return false;
        } 
        else {
            return p->child[word[i] - 'a'] && searchWord(word, p->child[word[i] - 'a'], i+1);
        }
    }
private:
    TrieNode *root;
};

// Your WordDictionary object will be instantiated and called as such:
// WordDictionary wordDictionary;
// wordDictionary.addWord("word");
// wordDictionary.search("pattern");