Add and Search Word - Data structure design

来源:互联网 发布:mac下载的搜狗输入法 编辑:程序博客网 时间:2024/05/16 10:05

Design a data structure that supports the following two operations:

void addWord(word)bool search(word)

search(word) can search a literal word or a regular expression string containing only lettersa-z or .. A . means it can represent any one letter.

For example:

addWord("bad")addWord("dad")addWord("mad")search("pad") -> falsesearch("bad") -> truesearch(".ad") -> truesearch("b..") -> true

Note:
You may assume that all words are consist of lowercase letters a-z.

class TrieNode{public:    bool isEnd;    TrieNode *children[26];    TrieNode() : isEnd(false)    {        for (int i = 0; i < 26; i++)        {            children[i] = NULL;        }    }};class WordDictionary {public:    WordDictionary()    {        root = new TrieNode();    }        // Adds a word into the data structure.    void addWord(string word) {        TrieNode *cur = root;        for (int i = 0; i < word.length(); i++)        {            int index = word[i] - 'a';            if (cur->children[index] == NULL)            {                cur->children[index] = new TrieNode();            }            cur = cur->children[index];        }        cur->isEnd = 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) {        int n = word.length();        return search(word, n, 0, root);    }        bool search(string &word, int n, int pos, TrieNode *cur)    {        if (cur == NULL)        {            return false;        }        if (pos == n)        {            return cur->isEnd;        }        if (word[pos] == '.')        {            for (int i = 0; i < 26; i++)            {                if (cur->children[i])                {                    if (search(word, n, pos+1, cur->children[i]))                    {                        return true;                    }                }            }        }        else        {            int index = word[pos] - 'a';            if (cur->children[index])            {                return search(word, n, pos+1, cur->children[index]);            }        }        return false;    }private:    TrieNode *root;};// Your WordDictionary object will be instantiated and called as such:// WordDictionary wordDictionary;// wordDictionary.addWord("word");// wordDictionary.search("pattern");


0 0