(中等)剑指Offer II 062.实现前缀树 Java

news2024/9/23 7:20:44

在这里插入图片描述
Trie,又称前缀树或字典树,是一棵有根树,其每个节点包含以下字段:

  • 指向子节点的指针数组children,对于本题而言,数组长度为26,即小写英文字母的数量。此时children[0]对应着小写字母a,children[1]对应着小写字母b,…,children[25]对应小写字母z
  • 布尔字段isEnd,表示该节点是否为字符串的结尾

插入字符串

从字典树的根开始,插入字符串。对于当前字符对应的子节点,有两种情况:

  • 子节点存在。沿着指针移动到子节点,继续处理下一个字符
  • 子节点不存在。创建一个新的子节点,记录在children数组的对应的位置上,然后沿着指针移动到子节点,继续搜索下一个字符。

重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾

查找前缀

从字典树的根开始,查找前缀。对于当前字符对应的子节点,有两种情况:

  • 子节点存在。沿着指针移动到子节点,继续搜索下一个字符
  • 子节点不存在。说明字典树中不包含该前缀,返回空指针

重复以上步骤,直到返回空指针或搜索完前缀的最后一个字符

若搜索到了前缀的末尾,就说明字典树中存在该前缀。此外,若前缀末尾对应的节点的isEnd为真,则说明字典树中存在该字符串

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

class Trie {

    private Trie[] children;
    private boolean isEnd;

    /**
     * Initialize your data structure here.
     */
    public Trie() {
        children = new Trie[26];
        isEnd = false;
    }

    /**
     * Inserts a word into the trie.
     */
    public void insert(String word) {
        Trie node = this;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            int index = c - 'a';
            if (node.children[index] == null) {
                node.children[index] = new Trie();
            }
            node = node.children[index];
        }
        node.isEnd = true;
    }

    /**
     * Returns if the word is in the trie.
     */
    public boolean search(String word) {
        Trie node = searchPrefix(word);
        return node != null && node.isEnd;
    }

    /**
     * Returns if there is any word in the trie that starts with the given prefix.
     */
    public boolean startsWith(String prefix) {
        return searchPrefix(prefix) != null;
    }

    private Trie searchPrefix(String prefix) {
        Trie node = this;
        for (int i = 0; i < prefix.length(); i++) {
            char c = prefix.charAt(i);
            int index = c - 'a';
            if (node.children[index] == null) {
                return null;
            }
            node = node.children[index];
        }
        return node;
    }
}

/**
 * Your Trie object will be instantiated and called as such:
 * Trie obj = new Trie();
 * obj.insert(word);
 * boolean param_2 = obj.search(word);
 * boolean param_3 = obj.startsWith(prefix);
 */

复杂度分析:

  • 时间复杂度:初始化为O(1),其余操作为O(|S|),其中|S|是每次插入或查询的字符串的长度
  • 空间复杂度:O( ∣ T ∣ ⋅ ∑ |T|\cdot\sum T),其中|T|为所有插入字符串的长度之和, ∑ \sum 为字符集大小,本题 ∑ = 26 \sum=26 =26

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(王道)——队列

一、队列的定义 三个重要名词&#xff1a;队头、队尾、空队列。 二、队列的基本操作 队列总结&#xff1a; 三、队列的顺序表实现 基本操作&#xff1a; 静态创建队列顺序表 队列顺序表的初始化操作&#xff1a; 入队操作&#xff1a; 入队操作优化&#xff1a; 最优版入队操作…

Navicat-Cracker NavicatCrackerDlg.cpp:332 -3已解决Navicat 162版本注册问题的详细分析与解决方案

博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&#x1f36d; 《MYSQL从入门到精通》数据库是开发者必会基础之…

一零六五、零基础入门数据挖掘-心跳信号分类预测(阿里云天池赛)

目录 赛制官方链接 赛题简介 赛制说明 长期赛&#xff08;2021年7月&#xff5e;&#xff09; 正式赛&#xff08;3月12日 - 5月12日&#xff09; 大赛组织 赛题背景 赛题数据 评测标准 结果提交 代码实现 赛制官方链接 零基础入门数据挖掘-心跳信号分类预测_学习赛_…

哈希表以及用js封装一个哈希表

最近在学数据结构和算法&#xff0c;正好将学习的东西记录下来&#xff0c;我是跟着一个b站博主学习的&#xff0c;是使用js来进行讲解的&#xff0c;待会也会在文章后面附上视频链接地址&#xff0c;大家想学习的可以去看看 本文主要讲解哈希表&#xff0c;其他数据结构后续学…

轻松入门Python量化交易(三)

大家好&#xff0c;我们接第二部分继续分析金融数据。 配对图和相关矩阵 证券中的相关性分析为我们提供了有趣的投资策略。市场中一个广为人知的策略叫做“Long-Short”&#xff0c;即买入一家公司的证券&#xff0c;同时卖出另一家公司的证券&#xff0c;相信这两个资产在市…

《微服务架构设计模式》第八章 外部API模式

内容总结自《微服务架构设计模式》 外部API模式 一、API设计难题二、API Gateway 模式1、简介2、所有者模式3、好处和弊端4、设计问题5、实现一个API Gateway 三、使用GraphQL 实现API Gateway四、总结 一、API设计难题 1、移动客户端的API设计难题 在此设计中&#xff0c;移动…

动态规划(二) —— 打家劫舍系列问题总结

前言 除了背包系列问题&#xff0c;打家劫舍系列问题同样也是动态规划的经典题目。在这篇文章中荔枝将会把打家劫舍系列问题做一下总结&#xff0c;再仔细体会动态规划的思想&#xff0c;希望能帮到有需要的小伙伴~~~ 文章目录 前言 一、Leecode198.打家劫舍 1.1 分析 1.2 …

C2C、B2B、B2C、O2O电商定义区别

如今是电子商务高度发展的时代&#xff0c;大多数传统企业商家都开始采取转型战略帮助企业发展&#xff0c;商业模式的选择是转型的关键点&#xff0c;下面小编向你详细介绍一下B2B、B2C、C2C、O2O这些商务模式&#xff0c;帮助你快速理解它们。 BBusiness&#xff0c;即企业;…

Servlet实现文件下载的功能

download.html <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><title>文件下载</title><base href"<%request.getContextPath()"/"%>>"> </head>…

前端基本功 用 React Hooks + Antd 实现一个 Todo-List

背景 使用 React Hooks 以及组件库 Antd 来实现一个可以 增删 标记是否完成 的 todo-list 思路 要实现一个 todo-list 首先想到用 useState 维护一个状态数组来保存当前 list &#xff0c;还要用一个状态维护添加框中的内容 const [todos, setTodos] useState(initialValu…

OpenCv图像基本变换

目录 一、图像翻转 二、图像旋转 三、仿射变换之平移 四、仿射变换之获取变换矩阵 五、仿射变换之透视变换 一、图像翻转 图像翻转不等同于旋转&#xff0c;类似于一些视频的拍摄&#xff0c;拍摄后实际是左右颠倒的&#xff0c;通过图像翻转可进行还原 案例代码如下: …

第十四章:Context Encoding for Semantic Segmentation ——语义分割的上下文编码

0.摘要 近期的研究在使用全卷积网络&#xff08;FCN&#xff09;框架改善像素级标注的空间分辨率方面取得了显著进展&#xff0c;通过采用扩张/空洞卷积、利用多尺度特征和细化边界等方法。本文通过引入上下文编码模块来探索全局上下文信息对语义分割的影响&#xff0c;该模块捕…

springMVC的开发步骤-15

第一步你用到前端核心控制器&#xff0c;你应该有他&#xff0c;因此导包&#xff1a; 第二步:配servlet 第三步&#xff1a;配控制器&#xff0c;用来调用视图 结束之后我要干嘛&#xff1f;这个springMvC,我能否将这个pojo放到容器内部当中&#xff0c;能否通过bean标签进行配…

Linux 系统编程-开发环境(三)

目录 16 vim 16.1 vi简介 16.1.1 命令行模式 16.1.2 文本输入模式 16.1.3 末行模式 16.2 vim基础操作 16.3 vim分屏操作 16.4 vim打造IDE 16.4.1 简洁版IDE 17 gcc 18 toolchain 19 静态库和共享库 19.1 静态库 19.2 共享库 19.2.1 基础班使 19.2.2 就业班使用…

BiSeNetv2(pytorch)测试、训练cityscapes

1. 源码&#xff1a; github: https://github.com/CoinCheung/BiSeNet git clone https://github.com/CoinCheung/BiSeNet.git2. 预训练模型&#xff1a; 工程下载后解压&#xff0c;并在其中创建文件夹【model】用于存放预训练模型&#xff1b; 3. 运行demo conda creat…

【安装】Linux环境下的 JDK的安装 安装配置 环境变量

目录 Linux安装java环境1.检查系统中是否有JDK2.删除原有的java相关的包3.上传jdk到指定的文件夹4.解压jdk-8u371-linux-x64.tar.gz5.配置jdk的环境变量6.让配置生效 运行一个jar包运行jar包进行测试 Oracle 甲骨文中国 | 云应用和云平台 windows环境下的 JDK官网下载 & 安…

Android实现抓包 使用Fiddler抓包

Fiddler下载&#xff1a;https://pan.baidu.com/s/1QzvL0xugp6XX7gbFBFlEJg?pwdbf6u 提取码&#xff1a;bf6u 1.Fiddler配置 如果用不到https可以不开启https抓包 电脑打开fiddler&#xff0c;手机电脑同一网段。fiddler打开https抓包(Tools->Options->HTTPS)&a…

re学习(17)Bugku-re-Tworld(使用DFS解决迷宫问题)

下载地址&#xff1a; 跳转提示 参考视频&#xff1a; 【Bugku/CTF/Re/WP】使用DFS解决迷宫问题CTF "Tworld"_哔哩哔哩_bilibili 载入IDA后发现有UPX壳&#xff0c;先用工具进行脱壳&#xff0c;然后载入IDA进行分析。 编写脚本&#xff1a; #全部代码 import…

【电路原理学习笔记】第3章:欧姆定律:3.3 电压的计算

第3章&#xff1a;欧姆定律 3.3 电压的计算 电压相关欧姆定律公式&#xff1a; V I R VIR VIR 【例3-11】在图3-10所示的电路中&#xff0c;产生5A电流需要多大电压&#xff1f; 【答】 V I R 5 A 100 Ω 500 V VIR5\rm A\times 100Ω500 V VIR5A100Ω500V 【同步练习…

N天爆肝数据库——MySQL(5)

本文主要对索引进行了讲解 这里写目录标题 本文主要对索引进行了讲解索引概述介绍优缺点索引结构二叉树红黑树B-Tree(多路平衡查找树)BTreeBTree与B-Tree区别: HashHash索引特点 为什么InnoDB存储引擎选择使用BTree索引结构&#xff1f;索引分类在InnoDB存储引擎中&#xff0c;…