OJ练习第182题——字典树(前缀树)

news2024/11/19 3:40:51

字典树(前缀树)

  • 208. 实现 Trie (前缀树)
    • 题目描述
    • 示例
    • 知识补充
    • 官解代码
  • 211. 添加与搜索单词 - 数据结构设计
    • 题目描述
    • 示例
    • 思路
    • Java代码

208. 实现 Trie (前缀树)

力扣链接:208. 实现 Trie (前缀树)

题目描述

在这里插入图片描述

示例

在这里插入图片描述

知识补充

在这里插入图片描述
插入字符串

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

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

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

查找前缀

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

子节点存在。沿着指针移动到子节点,继续搜索下一个字符。
子节点不存在。说明字典树中不包含该前缀,返回空指针。
重复以上步骤,直到返回空指针或搜索完前缀的最后一个字符。

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

官解代码

class Trie {
    private Trie[] children;
    private boolean isEnd;

    public Trie() {
        children = new Trie[26];
        isEnd = false;
    }
    
    public void insert(String word) {
        Trie node = this;
        for (int i = 0; i < word.length(); i++) {
            char ch = word.charAt(i);
            int index = ch - 'a';
            if (node.children[index] == null) {
                node.children[index] = new Trie();
            }
            node = node.children[index];
        }
        node.isEnd = true;
    }
    
    public boolean search(String word) {
        Trie node = searchPrefix(word);
        return node != null && node.isEnd;
    }
    
    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 ch = prefix.charAt(i);
            int index = ch - 'a';
            if (node.children[index] == null) {
                return null;
            }
            node = node.children[index];
        }
        return node;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/implement-trie-prefix-tree/solutions/717239/shi-xian-trie-qian-zhui-shu-by-leetcode-ti500/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

力扣链接:211. 添加与搜索单词 - 数据结构设计

题目描述

在这里插入图片描述

示例

在这里插入图片描述

思路

根据题意,WordDictionary 类需要支持添加单词和搜索单词的操作,可以使用字典树实现。

对于添加单词,将单词添加到字典树中即可。

对于搜索单词,从字典树的根结点开始搜索。由于待搜索的单词可能包含点号,因此在搜索过程中需要考虑点号的处理。对于当前字符是字母和点号的情况,分别按照如下方式处理:

如果当前字符是字母,则判断当前字符对应的子结点是否存在,如果子结点存在则移动到子结点,继续搜索下一个字符,如果子结点不存在则说明单词不存在,返回 false;

如果当前字符是点号,由于点号可以表示任何字母,因此需要对当前结点的所有非空子结点继续搜索下一个字符。

重复上述步骤,直到返回 false 或搜索完给定单词的最后一个字符。

如果搜索完给定的单词的最后一个字符,则当搜索到的最后一个结点的 isEnd 为 true 时,给定的单词存在。

特别地,当搜索到点号时,只要存在一个非空子结点可以搜索到给定的单词,即返回 true。

Java代码

class WordDictionary {
    private Trie root;
    public WordDictionary() {
        root = new Trie();
    }
    
    public void addWord(String word) {
        root.insert(word);
    }
    
    public boolean search(String word) {
        return dfs(word, 0, root);
    }
    private boolean dfs(String word, int index, Trie node) {
        if(index == word.length()) {
            return node.isEnd();
        }
        char ch = word.charAt(index);
        if(Character.isLetter(ch)) {
            int childIndex = ch - 'a';
            Trie child = node.getChildren()[childIndex];
            if(child != null && dfs(word, index + 1, child)) {
                return true;
            }
        }else {
            for(int i = 0; i < 26; i++) {
                Trie child = node.getChildren()[i];
                if(child != null && dfs(word, index + 1, child)) {
                    return true;
                }
            }
        }
        return false;
    }
}
class Trie {
    private Trie[] children;
    private boolean isEnd;

    public Trie() {
        children = new Trie[26];
        isEnd = false;
    }
    public void insert(String word) {
        Trie node = this;
        for(int i = 0; i < word.length(); i++) {
            char ch = word.charAt(i);
            int index = ch - 'a';
            if(node.children[index] == null) {
                node.children[index] = new Trie();
            }
            node = node.children[index];
        }
        node.isEnd = true;
    }
    public Trie[] getChildren() {
        return children;
    }
    public boolean isEnd() {
        return isEnd;
    }
}

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

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

相关文章

SPI—读写串行FLASH

一、SPI协议简介 SPI协议是由摩托罗拉公司提出的通讯协议&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛的使用在ADC、LCD等设备与MCU之间&#xff0c;要求通讯速率比较高的场合。 SP…

实验室信息管理系统(LIMS)全套源码,ASP.NET Dotnet 3.5 +EXT.NET+MSSQL 2018

实验室信息管理系统&#xff08;LIMS)源码 检测实验室LIMS系统全套源码 技术架构&#xff1a;ASP.NET Dotnet 3.5 EXT.NETMSSQL 2018 实验室信息管理系统&#xff08;LIMS)能够完成实验室数据和信息的收集、分析、报告和管理的系统。它是现代实验室综合管理的一种理念、技术、方…

【Nuxt】01 什么是SSR 服务端渲染

前言 在当前的前端开发工作中&#xff0c;我们见到最多的三种渲染方式&#xff0c;如下&#xff1a; CSR&#xff1a;Client Side Rendering&#xff0c;客户端&#xff08;通常是浏览器&#xff09;渲染&#xff1b;SSR&#xff1a;Server Side Rendering&#xff0c;服务端…

如何一键提取微信背景图?

微信图文中的背景图&#xff0c;就像室内装修中的墙纸。使用不同颜色、图案的背景图能让文章更有质感&#xff0c;更立体&#xff0c;能给读者带来不一样的视觉体验。那看到其他公众号用的背景图很好看&#xff0c;自己也想用&#xff0c;怎么办&#xff1f;&#xff08;以速排…

国货疯抢流量,B站接连爆发800万播放实现破圈

近日&#xff0c;“79元商战”的消息洗刷全平台&#xff0c;众多国货品牌的“不容易”开始被越来越多的消费者注意到&#xff0c;消费者们自发性地开始重新审视真正做产品的国货品牌们&#xff0c;并为之全力支持。有网友笑称&#xff1a;这“泼天的富贵”终于落到了国货品牌的…

软信天成:元数据的干货分享!建议点赞收藏

元数据&#xff08;Metadata&#xff09;为描述数据的数据&#xff08;data about data&#xff09;&#xff0c;主要是描述数据属性&#xff08;property&#xff09;的信息&#xff0c;用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。简单来讲&#xff0c;元数…

golang工程——grpc一元请求与流请求

唉&#xff0c;难顶&#xff0c;像块砖一样到处搬。又跑去golang技术栈的项目俩月 本篇博客多有参考&#xff0c;记录一下近期学习 rpc、grpc原理 grpc 是一项进程间通信技术&#xff0c;可以用来连接、调用、操作和调试构建分布式程序&#xff0c;调用过程如同调用函数一样&…

【剑指Offer】77.按之字形顺序打印二叉树

题目 给定一个二叉树&#xff0c;返回该二叉树的之字形层序遍历&#xff0c;&#xff08;第一层从左向右&#xff0c;下一层从右向左&#xff0c;一直这样交替&#xff09; 数据范围&#xff1a;0≤n≤1500,树上每个节点的val满足 ∣val∣<1500 要求&#xff1a;空间复杂度…

深入浅出DAX:SELECTEDVALUE()

深入浅出DAX&#xff1a;SELECTEDVALUE() SELECTEDVALUE()&#xff0c;如果筛选 columnName 的上下文后仅剩下一个非重复值&#xff0c;则返回该值。否则返回alternateResult&#xff0c;语法如下&#xff1a; SELECTEDVALUE(<columnName>[, <alternateResult>] …

CorelDRAW Graphics Suite2023绿色中文版本下载教程

CorelDRAW Graphics Suite2023版是领先的一体化软件包&#xff0c;它包括多个程序&#xff0c;如CorelDRAW、Corel PHOTO-PAINT、Corel CAPTURE、Corel Font Manager、Duplexing Wizard等&#xff0c;可全部安装&#xff0c;也可根据实际需要选择进行安装&#xff0c;都是最新版…

敏捷发布列车初探2 ---- Agile Release Train

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 敏捷发布列车二、ART的特性2.敏捷团队为列车提供动力3.与共同节奏保持一致4.关键角色启用 三、ART的责任总结 敏捷发布列车 敏捷发布列车&#xff08;ART&#xff…

PHP生成二维码带图标代码实例

PHP生成二维码带图标代码实例&#xff08;PHP QR Code二维码生成类库&#xff09; public static function png($text, $outfilefalse, $levelQR_ECLEVEL_L, $size3, $margin4, $saveandprintfalse) { $enc QRencode::factory($level, $size, $margin); return $enc->…

IP地址证书:保护网站安全的重要措施

首先&#xff0c;我们需要了解什么是IP地址证书。IP地址证书是一种专门用于公网IP地址验证的数字证书&#xff0c;它主要用于解决IP地址明文传输的安全隐患和加密传输的问题。那么IP地址证书是如何保护网站的&#xff1f; 1&#xff0c;身份验证 IP地址证书用于对网站进行身份…

mysql workbench常用操作

1、No database selected Select the default DB to be used by double-clicking its name in the SCHEMAS list in the sidebar 方法一&#xff1a;双击你要使用的库 方法二&#xff1a;USE 数据库名 2、复制表名&#xff0c;字段名 3、保存链接

Swift data范围截取问题

文章目录 一、截取字符串的几种方法1. 截取前几位2. 截取后几位3. subData4. 下标截取 二、subData(in:) 报错 EXC_BREAKPOINT 一、截取字符串的几种方法 1. 截取前几位 mobileID.prefix(32)2. 截取后几位 mobileID.suffix(3)3. subData data.subdata(in: 0..<4)4. 下标…

港科夜闻|香港科技大学颁授荣誉大学院士予六位杰出人士

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科技大学颁授荣誉大学院士予六位杰出人士。他们分别为陈晓峰先生、郑志刚博士、冯英伟先生、李慧诗女士、姚珏女士及叶毓强教授(按姓氏英文字母排序)。荣誉大学院士颁授典礼由香港科大校董会主席沈向洋教授和香港科大…

开发APP的费用是多少

开发一款APP的费用可以因多种因素而异&#xff0c;包括项目的规模、功能、复杂性、技术选择、地理位置等。北京是中国的大城市&#xff0c;APP开发的费用也会受到北京的物价水平和市场竞争的影响。以下是一些可以影响APP开发费用的因素&#xff0c;希望对大家有所帮助。北京木奇…

Codeforces Round 889 (Div. 2)A~C1题解

A. Dalton the Teacher 题目分析&#xff1a; 模拟&#xff0c;写出两个就能找出规律&#xff1a;坐在自己位子上的小孩会不高兴&#xff0c;所以统计下来cnt 发现cnt为奇数是(cnt1)/2次就能换成要求&#xff0c;偶数就是cnt/2 #include<bits/stdc.h> #pragma GCC op…

Silicon labs BG22蓝牙开发记录(一)

本篇内容适用初学者使用&#xff0c;主要介绍如何快速了解Siliconlabs EFR32BG22蓝牙芯片相关的软件资源和硬件资源&#xff0c;结合了我作为FAE 支持的一些个人看法&#xff0c;便于使用者快速入门&#xff0c;加速你们的产品实施。 本系列分为&#xff1a; Siliconlabs BG22…

世界前沿技术发展报告2023《世界信息技术发展报告》(一)世界信息技术及产业发展重要动向

&#xff08;一&#xff09;世界信息技术及产业发展重要动向 1. 概述2. 半导体技术水平持续进步&#xff0c;行业内部开始新一轮调整2.1 全球主要经济体加强半导体技术能力建设&#xff0c;推动厂商扩产2.2 先进制程技术持续发展&#xff0c;先进封装技术崭露头角2.3 消费电子半…