【数据结构】Trie 字典树

2023-11-16

在这里插入图片描述

数据结构源码

实现类


import java.util.TreeMap;

public class Trie {

    private class Node {

        public boolean isWord;

        public TreeMap<Character, Node> next;

        public Node(boolean isWord) {
            this.isWord = isWord;
            next = new TreeMap<>();
        }

        public Node() {
            this(false);
        }
    }

    private Node root;

    private int size;

    public Trie() {
        root = new Node();
        size = 0;
    }

    /**
     * 获得Trie中存储的单词数量
     * @return
     */
    public int getSize() {
        return size;
    }

    /**
     * 向Trie中添加一个新的单词word
     * @param word
     */
    public void add(String word) {
        Node cur = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (cur.next.get(c) == null) {
                cur.next.put(c, new Node());
            }
            cur = cur.next.get(c);
        }
        if (!cur.isWord) {
            cur.isWord = true;
            size++;
        }
    }

    /**
     * 查询单词word是否在Trie中
     * @return
     */
    public boolean contains(String word) {
        Node cur = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (cur.next.get(c) == null) {
                return false;
            }
            cur = cur.next.get(c);
        }
        return cur.isWord;
    }

    /**
     * 查询是否在Trie中有单词以prefix为前缀
     * @param prefix
     * @return
     */
    public boolean isPrefix(String prefix) {
        Node cur = root;
        for (int i = 0; i < prefix.length(); i++) {
            char c = prefix.charAt(i);
            if (cur.next.get(c) == null) {
                return false;
            }
            cur = cur.next.get(c);
        }
        return true;
    }

    public static void main(String[] args) {

    }
}


数据结构拆解

维护字段和内部类



    private class Node {

        public boolean isWord;

        public TreeMap<Character, Node> next;

        public Node(boolean isWord) {
            this.isWord = isWord;
            next = new TreeMap<>();
        }

        public Node() {
            this(false);
        }
    }

    private Node root;

    private int size;
    

构造函数



    public Trie() {
        root = new Node();
        size = 0;
    }




    /**
     * 向Trie中添加一个新的单词word
     * @param word
     */
    public void add(String word) {
        Node cur = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (cur.next.get(c) == null) {
                cur.next.put(c, new Node());
            }
            cur = cur.next.get(c);
        }
        if (!cur.isWord) {
            cur.isWord = true;
            size++;
        }
    }




    /**
     * 获得Trie中存储的单词数量
     * @return
     */
    public int getSize() {
        return size;
    }



    /**
     * 查询单词word是否在Trie中
     * @return
     */
    public boolean contains(String word) {
        Node cur = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (cur.next.get(c) == null) {
                return false;
            }
            cur = cur.next.get(c);
        }
        return cur.isWord;
    }

    /**
     * 查询是否在Trie中有单词以prefix为前缀
     * @param prefix
     * @return
     */
    public boolean isPrefix(String prefix) {
        Node cur = root;
        for (int i = 0; i < prefix.length(); i++) {
            char c = prefix.charAt(i);
            if (cur.next.get(c) == null) {
                return false;
            }
            cur = cur.next.get(c);
        }
        return true;
    }


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】Trie 字典树 的相关文章

随机推荐

  • Xilinx BUFGMUX使用注意事项

    Xilinx BUFGMUX使用注意事项 最近使用Xilinx FPGA的时候 需要用到一个外部时钟和一个PLL产生的时钟 可以通过外部SWICH进行时钟的切换 觉得这种方式可以通过原语例化完成 原语 果不其然 在原语示例中找到了类似的模块
  • java基础:浅谈泛型

    1 为什么要使用泛型 给一段代码 import java util ArrayList import java util List public class GenericList error public static void main
  • 解决“The method XXXXXX of type XXXXXXXXX must override a superclass method”

    我的Eclipse版本是3 6 1 Override 时出现以下错误 The method XXXXXX of type XXXXXXXXX must override a superclass method 上网搜索原来原因是 实现类里面
  • Docker 部署Streamlit项目

    文章目录 前言 关于streamlit Docker 部署Streamlit项目 Streamlit如何部署到云服务器 1 安装docker 2 拉取python镜像 2 1 什么是DockerHub 2 2 配置docker加速器 2 3
  • SpringMVC增删改查(CRUD)的实现

    目录 前言 一 前期准备 1 pom xml 依赖与插件的导入 2 jdbc properties 数据库连接 3 log4j2 xml 日志文件 4 spring mybatis mybatis与spring整合文件 5 spring c
  • 解决AttributeError: module 'tensorflow' has no attribute 'ConfigProto'

    使用CUDA10 1加上Tensorflow 2 0会出现AttributeError module tensorflow has no attribute ConfigProto 这个问题 这个是由于现在新版本中一些1 0版本的函数被和2
  • Android自动化测试中操作技巧合集(建议收藏)

    Android自动化测试中短信验证码的操作技巧 一 内容提供器机制简介 Android 系统采用了内容提供器 ContentProvider 机制来管理不同应用的数据访问 内容提供器为不同应用间的数据共享提供了接口 它们像是一个中央数据仓库
  • 快速中值求取算法

    中值 顾名思义 就是指一个从小到大的序列的中间的那一个数 一般的讲 中值比平均值还要更加稳定 如一个序列中的某一个值被误乘以了100 平均值则会有很大的波动 但是中位数则不会发生太大的变化 但是如果对数据先排序 然后再进行取中值 则比较耗时
  • Spring3与安全框架apache shiro的整合

    shiro是一个很不错的安全框架 相对Spring security 来说要简单易用的多 使用shiro来做web的权限子系统是不错的选择 下面记录一下shiro和Spring整合的过程 Applicationcontext shiro x
  • k-近邻算法

    k 近邻算法 k 近邻算法概述 k 近邻算法 k NearestNeighor Algorithm 是采用测量不同特征值之间的距离方法进行分类 简称kNN 这里用到的距离计算是欧几里德距离 工作原理 存在一个样本数据集合 i 0 n 也称作
  • 《Ansible Playbook扩展:block块》

    一 用块分组任务 block任务块就是一组逻辑的tasks 使用block可以将多个任务合并为一个组 示例如下 block name 检查 service 服务 role 节点端口 shell nc vz MYSQL MASTER HOST
  • OpenGL 超级宝典笔记 —— 纹理高级(三)

    纹理组合器 OpenGL 的纹理组合器可以控制多重纹理的片段是如何组合的 一般情况下 我们可以简单的为每个纹理单元设置一个纹理环境模式 GL REPLACE GL DECAL GL ADD 和 GL MODULATE 把每个纹理应用的结果添
  • LNMP1.3 phpMyAdmin 打开空白的问题

    如果你找了很多方法 比如修改配置文件等等 都没有办法的话 或许我这里可以解决这个问题 请回忆一下 你 是否 安装了 eAccelerator 这个东西 如果有 卸载掉就好了 坑人的eAccelerator addons sh uninsta
  • ug装配绕轴旋转_UG模具设计培训就到新科教育

    培训内容 1 机械CAD精品班 CAD初级 制图 CAD基础及简单施工图 建筑剖面图 立面图 机械剖面 立面图等绘制CAD三维制图 面域 实体建模 曲面拉伸成形 剖切 三维实体运算 平移曲面 旋转曲面等方法建模 灯光设置 材质表现 工程出图
  • C++动态内存管理

    动态内存 在C C 程序中 线程 栈空间是有限的 大部分变量使用的都是动态分配来的堆内存 这些动态申请来的堆内存是需要开发者通过代码去自行管理的 如何管理好这些动态申请来的内存 是C C 开发中的一个重点难点问题 malloc是开空间 ca
  • Mysql:如果数据存在则更新,不存在则插入

    文章目录 ON DUPLICATE KEY UPDATE 语法 特点 REPLACE INTO 语法 语句1 不存在则插入 语句2 存在则先删除后插入 特点 REPLACE 语法 参考 DUPLICATE REPLACE INTO REPL
  • 前端如何使用vue实现excel的上传解析与导出功能

    前端如何使用vue实现excel的上传解析与导出功能 要使用Vue实现Excel上传解析与导出功能 你需要做以下几步 安装依赖 首先 你需要安装xlsx和file saver这两个库 用于Excel文件的读取与导出 你可以在你的Vue项目中
  • DNS详解

    DNS详解 DNS解析 实验目的 通过实验 理解DNS解析原理 掌握windows下DNS服务器的安装与配置过程 理解DNS下不同的记录类型 实验环境 服务器 windows server 2012 用于安装DNS服务器 客户端 windo
  • Mybatis分页方式及实现原理

    一 mybatis的4种分页方式 物理分页 逻辑分页 1 借助Sql语句Q进行分页 物理分页 2 拦截器分页 物理分页 通过拦截器给sq语句末尾加Eimt语句来查询 3 借助 数组Q进行分页 逻辑分页 4 RowBounds分页插件实现分页
  • 【数据结构】Trie 字典树

    数据结构源码 实现类 import java util TreeMap public class Trie private class Node public boolean isWord public TreeMap