Add and Search Word

来源:互联网 发布:编程有什么用 编辑:程序博客网 时间:2024/05/16 07:19

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 letters a-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.

解题思路:

这道题的解法类似于Implement Trie (Prefix Tree),查找词时,单词中包含 .,所以需要使用dfs搜索。


代码:

class Word{public:    bool isword;    Word *child[26];    Word():isword(false)    {        for(int i = 0; i < 26; i ++)        {            child[i] = NULL;        }    }};class WordDictionary {public:    /** Initialize your data structure here. */    WordDictionary() {        root = new Word();    }    /** Adds a word into the data structure. */    void addWord(string word) {        Word *p = root;        for(int i = 0; i < word.size(); i++)        {            int t = word[i] - 'a';            if(!p->child[t]) p->child[t] = new Word();            p = p->child[t];        }        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 dfs(Word *p, string word, int n)    {        if(n  == word.size())        {            return p->isword;        }        if(word[n] != '.')        {            int t = word[n] - 'a';            if(!p->child[t]) return false;            p = p->child[t];            return dfs(p, word, n + 1);        }        else        {            for(int i = 0; i < 26; i++)            {                 if(p->child[i] && dfs(p->child[i], word, n + 1))                    return true;            }            return false;        }            }    bool search(string word) {        return dfs(root, word, 0);    }private:    Word *root;};