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

[题目:
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值