《五月集训》(第二十三天)——字典树

前言

        欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
        今天是五月集训第二十三天:字典树🔥🔥🔥🔥🔥🔥

一、练习题目

        211. 添加与搜索单词 - 数据结构设计
        1268. 搜索推荐系统
        421. 数组中两个数的最大异或值
        1707. 与数组中元素的最大异或值

二、未完待续

2022-05-23 13:34字典树是一个完全不会的领域,花了时间看了关于字典树的先验知识,再来看题,做了第一题,不是自己写的,但是敲了一遍会发现对文章写的东西看起来好理解了一点,剩下的题目后续慢慢来了😢。越来越难。

三、算法思路

  • 1、211. 添加与搜索单词 - 数据结构设计:学习字典树的插入和搜索操作,字典树的搜索操作是需要用深搜来完成的。
  • 2、1268. 搜索推荐系统:
  • 3、421. 数组中两个数的最大异或值:
  • 4、1707. 与数组中元素的最大异或值:

四、源码剖析

// 211. 添加与搜索单词 - 数据结构设计
class WordDictionary {
public:
    struct TrieNode {
        int isEnd;
        struct TrieNode*next[26];
        TrieNode() {
            isEnd = false;
            memset(next, 0, sizeof(next));
        }
    }; //(1)

    struct TrieTree {
        TrieNode *root;
        TrieTree() {
            root = nullptr;
        }

        void insert(const string& s) {
            if(root == nullptr) {
                root = new TrieNode();
            }
            TrieNode *now = root;
            for(int i = 0; i < s.size(); ++i) {
                int idx = s[i] - 'a';
                if(now->next[idx] == nullptr) {
                    now->next[idx] = new TrieNode();
                }
                now = now->next[idx];
            }
            now->isEnd = true;
        } //(2)

        bool dfs(TrieNode* now, const string& s, int idx) {
            if(now == nullptr) {
                return false;
            }
            if(idx == s.size()) {
                return now->isEnd;
            }

            if(s[idx] == '.') {
                for(int i = 0; i < 26; ++i) {
                    if(dfs(now->next[i], s, idx+1)) {
                        return true;
                    }
                }
                return false;
            }else {
                return dfs(now->next[s[idx] - 'a'], s, idx+1);
            }
        }
    }; //(3)

    TrieTree t;
    
    WordDictionary() {

    }
    
    void addWord(string word) {
        t.insert(word);
    }
    
    bool search(string word) {
        return t.dfs(t.root, word, 0);
    }
};
  • 1、构建字典树的结点;
  • 2、完成字典树中的插入操作;
  • 3、完成字典树中的搜索操作,要考虑有’.'存在的问题。
// 1268. 搜索推荐系统
  • 1、
// 421. 数组中两个数的最大异或值

  • 1、
// 1707. 与数组中元素的最大异或值

  • 1、
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值