LC211. 添加与搜索单词 - 数据结构设计

题目

请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。

实现词典类 WordDictionary :

WordDictionary() 初始化词典对象
void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配
bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回  false 。word 中可能包含一些 '.' ,每个 . 都可以表示任何一个字母。

1 <= word.length <= 500
addWord 中的 word 由小写英文字母组成
search 中的 word 由 ‘.’ 或小写英文字母组成
最多调用 50000 次 addWord 和 search

示例

输入:
[“WordDictionary”,“addWord”,“addWord”,“addWord”,“search”,“search”,“search”,“search”]
[[],[“bad”],[“dad”],[“mad”],[“pad”],[“bad”],[".ad"],[“b…”]]
输出:
[null,null,null,null,false,true,true,true]

解释:
WordDictionary wordDictionary = new WordDictionary();
wordDictionary.addWord(“bad”);
wordDictionary.addWord(“dad”);
wordDictionary.addWord(“mad”);
wordDictionary.search(“pad”); // return False
wordDictionary.search(“bad”); // return True
wordDictionary.search(".ad"); // return True
wordDictionary.search(“b…”); // return True

思路

题目中说匹配时word中可以带. 可以代表任意字母,因此search匹配时需要对字符串每个字母匹配

注:

  • word应与存储的字符串长度一致(特别是带.的)
  • 哈希映射或者字符串数组暴力search会超时

应该采用字典树(前缀树),字典树的本质是把很多字符串拆成单个字符的形式,以树的方式存储起来,正适合此题求解。

代码

class WordDictionary {
public:
    struct TrieNode{
        bool val;
        TrieNode *child[26];  //子节点应包含二十六个字母
    } *tree;

    WordDictionary() {
        tree = new TrieNode();
    }
    
    void addWord(string word) {
        TrieNode *tree1 = tree;
        for(int i=0;i<word.size();i++){
            if(tree1->child[word[i]-'a']==nullptr){
                tree1->child[word[i]-'a'] = new TrieNode();
            }
            tree1 = tree1->child[word[i]-'a'];
        }
        tree1->val  = true;
    }
    
    bool search(string word) {
        TrieNode *tree1=tree;
        return find(tree1, word, 0, word.size());
    }

    bool find(TrieNode *tree1, string word, int i, int n){
        if(i==n) return tree1->val;
        if(word[i]!='.'){
            if((tree1->child[word[i]-'a']!=nullptr)&&find(tree1->child[word[i]-'a'], word, i+1, n)){
                return true;
            }
        }
        else{
            for(int j=0;j<26;j++){
                if((tree1->child[j]!=nullptr)&&find(tree1->child[j], word, i+1, n)){
                    return true;
                }
            }
        }
        return false;
    }
};

问题

  • 树节点使用时需要new创建存储空间
  • 首先想到的是暴力求解
  • 没有考虑到带.的word与可能与存储字符串不一致的情况
  • 第一次递归时将全局变量tree带进去了,没有考虑到指针移位造成下一次访问影响。应重定义一个树。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值