[leetcode] 211.Add and Search Word - Data structure design

来源:互联网 发布:西班牙语同声传译软件 编辑:程序博客网 时间:2024/05/19 12:15

[题目:
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”) -> false
search(“bad”) -> true
search(“.ad”) -> true
search(“b..”) -> true
题意:
设置数据结构,可以存放字符串,可以查询某个字符串是否存储过。并且支持通配符,’.’可以代表任意一个字符。
思路:
这道题仍旧使用trie树来存放节点。只是在搜索时由于通配符可以适配任一个字符,所以需要采用回溯的方法。匹配到当前字符时,如果遇到’.’,那么就找任一个子孩子,尝试继续寻找下去。
以上。
代码如下:

struct TrieNode {    char c;    bool leaf;    TrieNode* children[26];    TrieNode(char cc):c(cc),leaf(false) {        memset(children, 0, sizeof(children));    }    TrieNode():leaf(false) {        memset(children, 0, sizeof(children));    }};class WordDictionary {public:    WordDictionary() {        root = new TrieNode();    }    // Adds a word into the data structure.    void addWord(string word) {        if(word.empty())return;        TrieNode* tmp = root;        for(auto i : word) {            if(tmp->children[i - 'a'] == NULL) {                TrieNode * node = new TrieNode(i);                tmp->children[i - 'a'] = node;            }            tmp = tmp->children[i - 'a'];        }        tmp->leaf = 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) {        if(word.size() == 0)return false;        search(word, 0, root);    }    bool search(string& word, int index, TrieNode* node) {        if(index == word.size())return node->leaf;        if(word[index] != '.') {            TrieNode* tmp = node->children[word[index] - 'a'];            if(tmp == NULL)return false;            else return search(word, index + 1, tmp);        }        else {            for(int i = 0; i < 26; i++) {                 TrieNode* tmp = node->children[i];                 if(tmp != NULL) {                     if(search(word, index + 1, tmp))return true;                 }            }            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