首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >字典树

字典树

作者头像
hotarugali
发布2022-03-02 20:53:16
发布2022-03-02 20:53:16
5830
举报

1. 简介

字典树(Trie)用边来代表字母,从根结点到树上某一结点的路径就代表了一个字符串。

2. 实现

  • 由于字典树中的字符串都是从根结点开始,于是我们可以通过标记字符串的终止结点来记录已经插入字典树中的字符串。
  • 我们用\delta(u,c) 表示结点 u c字符指向的下一结点,即在结点 u 代表的字符串后面添加一个字符 c 形成的字符串的结点。
  • 由于字典树的分支取决于字符串中最大可能出现的不同字符数 m,因此字典树是一棵 m叉树,我们可以采用动态开点的方式构建字典树。

3. 模板

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;

#ifndef _TRIE_
#define _TRIE_
#define ll int
#define MAXN 100005
#define MAXCHAR 128

//字典树
struct Trie {
    ll cnt;                     // 动态开点(开 Trie 树结点编号)
    ll next[MAXN][MAXCHAR];     // 记录关联边为对应字符的子结点的下表
    bool exist[MAXN];           // 记录以该结点结尾的字符串是否存在
    Trie(): cnt(0) {}
    // 插入字符串
    void insert(char *str, ll len) {
        ll p = 0;
        for(ll i = 0; i < len; ++i) {
            ll c = str[i];
            if(!next[p][c]) {
                next[p][c] = ++cnt;
            }
            p = next[p][c];
        }
        exist[p] = 1;
    }
    // 查找字符串
    bool find(char *str, ll len) {
        ll p = 0;
        for(ll i = 0; i < len; ++i) {
            ll c = str[i];
            if(!next[p][c]) {
                return false;
            }
            p = next[p][c];
        }
        return exist[p];
    }
};
#endif
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 简介
  • 2. 实现
  • 3. 模板
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档