力扣labuladong一刷day54天前缀树

力扣labuladong一刷day54天前缀树

文章目录

      • 力扣labuladong一刷day54天前缀树
      • 一、208. 实现 Trie (前缀树)
      • 二、648. 单词替换
      • 三、211. 添加与搜索单词 - 数据结构设计
      • 四、1804. 实现 Trie (前缀树) II
      • 五、677. 键值映射

一、208. 实现 Trie (前缀树)

题目链接:https://leetcode.cn/problems/implement-trie-prefix-tree/description/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china
思路:类似于下图就是前缀树,本质是多叉树,只不过表示子节点的数组是通过字母进行索引的,叶子节点有值来表示。
在这里插入图片描述

class Trie {Node root = null;class Node{int v = 0;Node[] child = new Node[26];}public Trie() {}public void insert(String word) {if (search(word)) {return;}root = addNode(root, word, 0);}public boolean search(String word) {Node node = getNode(root, word);if (node == null || node.v == 0) {return false;}return true;}public boolean startsWith(String prefix) {return getNode(root, prefix) != null;}Node getNode(Node node, String word) {Node p = node;for (int i = 0; i < word.length(); i++) {if (p == null) {return null;}p = p.child[word.charAt(i)-'a'];}return p;}Node addNode(Node node, String word, int i) {if (node == null) {node = new Node();}if (i == word.length()) {node.v = 1;return node;}int c = word.charAt(i) - 'a';node.child[c] = addNode(node.child[c], word, i+1);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);*/

二、648. 单词替换

题目链接:https://leetcode.cn/problems/replace-words/description/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china
思路:和上题一样,也是前缀树的应用,只不过多了一个最短前缀替换。

class Solution {public String replaceWords(List<String> dictionary, String sentence) {Trie trie = new Trie();for (String s : dictionary) {trie.insert(s);}String[] split = sentence.split(" ");StringBuilder bf = new StringBuilder();for (String s : split) {String ms = trie.minSearch(s);if ("".equals(ms)) {bf.append(s);}else {bf.append(ms);}bf.append(" ");}bf.deleteCharAt(bf.length()-1);return bf.toString();}class Node {int v = 0;Node[] child = new Node[26];}class Trie {Node root = null;void insert(String word) {root = addNode(root, word, 0);}String minSearch(String word) {Node p = root;for (int i = 0; i < word.length(); i++) {if (p == null) return "";if (p.v == 1) {return word.substring(0, i);}p = p.child[word.charAt(i)-'a'];}if (p != null && p.v == 1) return word;return "";}boolean search(String word) {Node node = getNode(word);if (node == null || node.v == 0) return false;return true;}Node getNode(String word) {Node p = root;for (int i = 0; i < word.length(); i++) {if (p == null) return null;p = p.child[word.charAt(i)-'a'];}return p;}Node addNode(Node node, String word, int i) {if (node == null) {node = new Node();}if (i == word.length()) {node.v = 1;return node;}int c = word.charAt(i)-'a';node.child[c] = addNode(node.child[c], word, i+1);return node;}}
}

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

题目链接:https://leetcode.cn/problems/design-add-and-search-words-data-structure/description/
思路:本题还是前缀树,和上一题类似,唯一不同的点是多了一个模式串匹配。

class WordDictionary {Node root = null;public WordDictionary() {}public void addWord(String word) {root = addNode(root, word, 0);}public boolean search(String word) {return traverse(root, word, 0);}boolean traverse(Node node, String word, int i) {if (node == null) return false;if (i == word.length()) {return node.v == 1;}if ('.' == word.charAt(i)) {for (int j = 0; j < 26; j++) {boolean flag = traverse(node.child[j], word, i + 1);if (flag) return flag;}}else {return traverse(node.child[word.charAt(i)-'a'], word, i+1);}return false;}Node addNode(Node node, String word, int i) {if (node == null) {node = new Node();}if (i == word.length()) {node.v = 1;return node;}int c = word.charAt(i)-'a';node.child[c] = addNode(node.child[c], word, i+1);return node;}}
class Node {int v;Node[] child = new Node[26];
}/*** Your WordDictionary object will be instantiated and called as such:* WordDictionary obj = new WordDictionary();* obj.addWord(word);* boolean param_2 = obj.search(word);*/

四、1804. 实现 Trie (前缀树) II

题目链接:https://leetcode.cn/problems/implement-trie-ii-prefix-tree/description/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china
思路:本题的前缀树多增加了一个功能就是删除节点,删除节点要考虑的就比较多了,到达value的位置要把数量减一,然后在后序位置删除,如果值大于0直接返回就行,不用删除节点,如果值不大于0就需要看该节点的child是否全为null,如果是返回Null就删除了,不是的话保留。

class Trie {Node root;public Trie() {}public void insert(String word) {root = addNode(root, word, 0);}public int countWordsEqualTo(String word) {Node node = getNode(word);if (null == node) return 0;return node.v;}public int countWordsStartingWith(String prefix) {Node node = getNode(prefix);if (node == null) return 0;return traverse(node, 0);}public void erase(String word) {if (getNode(word) == null) return;root = deleteNode(root, word, 0);}Node deleteNode(Node node, String word, int i) {if (node == null) return null;if (i == word.length()) {if (node.v > 0) node.v--;}else {int c = word.charAt(i)-'a';node.child[c] = deleteNode(node.child[c], word, i+1);}if (node.v > 0) return node;for (int j = 0; j < 26; j++) {if (node.child[j] != null) {return node;}}return null;}int traverse(Node node, int num) {if (node == null) return 0;num = node.v;for (int i = 0; i < 26; i++) {num += traverse(node.child[i], num);}return num;}Node addNode(Node node, String word, int i) {if (node == null) {node = new Node();}if (i == word.length()) {node.v += 1;return node;}int c = word.charAt(i)-'a';node.child[c] = addNode(node.child[c], word, i+1);return node;}Node getNode(String word) {Node p = root;for (int i = 0; i < word.length(); i++) {if (p == null) return null;p = p.child[word.charAt(i)-'a'];}return p;}
}
class Node{int v = 0;Node[] child = new Node[26];
}/*** Your Trie object will be instantiated and called as such:* Trie obj = new Trie();* obj.insert(word);* int param_2 = obj.countWordsEqualTo(word);* int param_3 = obj.countWordsStartingWith(prefix);* obj.erase(word);*/

五、677. 键值映射

题目链接:https://leetcode.cn/problems/map-sum-pairs/description/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china
思路:关键点是前缀查询,先获取到前缀的节点,然后广度优先遍历,前序位置记录节点位置。

class MapSum {Node root = null;public MapSum() {}public void insert(String key, int val) {root = addNode(root, key, val, 0);}public int sum(String prefix) {Node node = getNode(prefix);if (node == null) return 0;return traverse(node, 0);}int traverse(Node node, int num) {if (node == null) return 0;num = node.v;for (int i = 0; i < 26; i++) {num += traverse(node.child[i], num);}return num;}Node getNode(String word) {Node p = root;for (int i = 0; i < word.length(); i++) {if (p == null) return null;p = p.child[word.charAt(i)-'a'];}return p;}Node addNode(Node node, String word, int value, int i) {if (node == null) {node = new Node();}if (i == word.length()) {node.v = value;return node;}int c = word.charAt(i) - 'a';node.child[c] = addNode(node.child[c], word, value, i+1);return node;}}
class Node {int v = 0;Node[] child = new Node[26];
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【DevOps-05】Integrate工具

一、简要说明 持续集成、持续部署的工具很多,其中Jenkins是一个开源的持续集成平台。 Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务,并且还涉及到了构建项目等任务。 Jenkins需要大量的插件保证工作,安装成本较高,下面会基于Docker搭建Jenkins。 二、Jenk…

11.perror函数的使用

文章目录 perror函数介绍简介&#xff1a; 测试代码 perror函数介绍 函数原型&#xff1a;void perror(char const *message); 简介&#xff1a; perror函数&#xff0c;以一种简单、统一的方式报告错误。标准库函数在一个外部整型变量errno&#xff08;在errno.h中定义&…

大模型实战营Day2 作业

基础作业 1 使用 InternLM-Chat-7B 模型生成 300 字的小故事 2 熟悉 hugging face 下载功能&#xff0c;使用 huggingface_hub python 包&#xff0c;下载 InternLM-20B 的 config.json 文件到本地 进阶作业 1 完成浦语灵笔的图文理解及创作部署 2 完成 Lagent 工具调用 Demo…

vue3 响应式api中特殊的api

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录一、shallowRef()二、triggerRef()三、customRef()四、shallowReactive()五、shallowReadonly()六、toRaw()七、markRaw()八、effectScope()九、getCurrentScope() 一、shallowRef() shallowRef()是一个新的响…

多线程高级面试题

1. 什么是 ThreadLocal&#xff1f; 参考答案 ThreadLocal 叫做本地线程变量&#xff0c;意思是说&#xff0c;ThreadLocal 中填充的的是当前线程的变量&#xff0c;该变量对其他线程而言是封闭且隔离的&#xff0c;ThreadLocal 为变量在每个线程中创建了一个副本&#xff0c;…

【AI视野·今日Robot 机器人论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 5 Jan 2024 Totally 11 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Machine Learning in Robotic Ultrasound Imaging: Challenges and Perspectives Authors Yuan Bi, Zhongliang Jiang, Felix D…

gradle安装

从gradle下载安装包。 安装环境变量以及仓库存储地址。 在path中添加bin路径 打开cmd命令&#xff0c; 输入 gradle -v 查看版本信息。

JVM工作原理与实战(九):类加载器-启动类加载器

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、启动类加载器 二、通过启动类加载器去加载用户jar包 1.放入jre/lib目录进行扩展 2.使用参数进行扩展 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码…

优化器(一)torch.optim.SGD-随机梯度下降法

torch.optim.SGD-随机梯度下降法 import torch import torchvision.datasets from torch import nn from torch.utils.data import DataLoaderdataset torchvision.datasets.CIFAR10(root./data, trainFalse, downloadTrue,transformtorchvision.transforms.ToTensor()) data…

RK3399平台入门到精通系列讲解(实验篇)自定义工作队列的使用

🚀返回总目录 文章目录 一、自定义工作队列介绍1.1、工作队列相关结构体1.2、工作队列相关接口函数二、自定义共享队列案例2.1、Makefile2.2、驱动案例共享队列是由内核管理的全局工作队列,自定义工作队列是由内核或驱动程序创建的特定工作队列,用于处理特定的任务。 一、…

华为mstp、vrrp、ospf、isis、bgp等综合一起排错

最终实现左边私网和右边私网全部ping通 SW1 vlan batch 12 34 stp region-configuration //mstp配置 region-name test instance 12 vlan 12 instance 34 vlan 34 active region-configuration interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass …

求更新后的路由表

假定网络中的路由器B的路由表有如下的项目 (这三列分别表示“目的网络“距离”和“下一跳路由器”): 现在B收到从C发来的路由信息(这两列分别表示“目的网络”和“距离”): 试求出路由器B更新后的路由表(详细说明每一个步骤)。 (1)首先把收到的路由信息的"距离"1: …

[论文阅读] Revisiting Feature Propagation and Aggregation in Polyp Segmentation

[论文地址] [代码] [MICCAI 23] Abstract 息肉的准确分割是筛查过程中有效诊断结直肠癌的关键步骤。 由于能够有效捕获多尺度上下文信息&#xff0c;普遍采用类似UNet 的编码器-解码器框架。 然而&#xff0c;两个主要限制阻碍了网络实现有效的特征传播和聚合。 首先&#xff…

我的创作纪念日——redis的历史纪录

机缘 最开始只想存留点Redis的操作信息&#xff0c;后来写着写着也就写多了&#xff0c;虽然后面很长时间由于忙就没继续写&#xff0c;但是还是偶尔登录看一下&#xff0c;有好几篇文章的浏览量还是很多的呢。 收获 收获不多&#xff0c;粉丝也才三十多个&#xff0c;浏览量感…

Nacos 持久化及集群的搭建【微服务】

文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务&#xff0c;管理起来非常简单&#xff0c;但…

【100个Cocos实例】通过重写源码实现循环PageView

引言 Cocos中通过重写源码实现循环PageView 大家好&#xff0c;有小伙伴私信我&#xff1a; 有没有办法实现循环的PageView列表的方法呢 本文将介绍一下Cocos中通过重写源码实现循环PageView。 本文源工程可在文末阅读原文获取&#xff0c;小伙伴们自行前往。 1.什么是Page…

【Spring实战】25 Spring Boot Admin 应用

文章目录 1. 查看健康信息2. 使用 Micrometer 和 "/metrics"3. 管理包和类的日志级别4. 其他功能总结 Spring Boot Admin 是一个功能强大的工具&#xff0c;用于监控和管理多个 Spring Boot 应用程序。通过上一篇文章 【Spring实战】24 使用 Spring Boot Admin 管理…

景联文科技GPT教育题库:AI教育大模型的强大数据引擎

GPT-4发布后&#xff0c;美国奥数队总教练、卡耐基梅隆大学数学系教授罗博认为&#xff0c;这个几乎是用“刷题”方式喂大的AI教育大模型的到来&#xff0c;意味着人类的刷题时代即将退出历史舞台。 未来教育将更加注重学生的个性化需求和多元化发展&#xff0c;借助GPT和AI教育…

工厂方法模式(Factory Method)

文章目录 定义与类型适用场景优点缺点工厂方法代码示例 定义与类型 定义&#xff1a;定义一个创建对象的接口&#xff0c;但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。 类型&#xff1a;创建型。 适用场景 创建对象需要大量重复的代码…

mysql视图和sql语句

mysql视图和sql语句 一.mysql视图1.数据的虚拟表示&#xff1a;2.简化复杂查询&#xff1a;3.安全性和权限控制&#xff1a;4.逻辑数据组织&#xff1a;5.更新限制&#xff1a;6.视图的创建&#xff1a; 二.mysq语句使用案列 MySQL的视图&#xff08;View&#xff09;是一个虚拟…