Leetcode211 - Add and Search Word - Data structure design

来源:互联网 发布:macbook 软件 编辑:程序博客网 时间:2024/06/05 02:03

我的新博客地址:HuHaoyu’s Blog,最近新增了Jekyll的paginator分页功能Swiftype的搜索引擎。欢迎参观!

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.

题意

设计一种数据结构支持如下两个操作:

void addWord(word)bool search(word)

search(word) 可以搜索普通字母 a-z.。其中, . 可以代表任意一个字母。

举例如下:

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

提示:

提供的所有单词都是由小写字母 a-z 组成。

分析

不管用hash还是trie,插入(addWord(string word))的时间复杂度最好就是Σni,即所有字典集元素的字符个数。而查找(search(string word))的时间复杂度则不同。由于.的存在,使得hash的O(1)查找失去了优势。而Trie Tree则可以在遇到.时递归地搜索对应节点下的每一个letter。因此最后决定采用字典树作为数据结构。

非常无语的是在submit solution时,总报错invalid types ‘TrieNode* [26][<unresolved overloaded function type>]’ for array subscript,原本以为语法写错了,最后才发现原来某处index写成了inedex。并不知道为什么会报这种错误=.=。

AC代码

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

如果代码或分析有误,请批评指正。谢谢。

0 0
原创粉丝点击