秋招LeetCode刷题Day1 -- 前缀树专题

news2024/11/26 16:51:13

一个人的朝圣 — LeetCode打卡第 天

  • 知识总结
  • Leetcode 208. 实现 Trie (前缀树)
    • 题目说明
    • 代码说明
  • Leetcode 211. 添加与搜索单词 - 数据结构设计
    • 题目说明
    • 代码说明
  • Leetcode 648. 单词替换
    • 题目说明
    • 代码说明


知识总结

今天重新学习了一下前缀树以及相关的知识


Leetcode 208. 实现 Trie (前缀树)

题目链接

题目说明

Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。

请你实现 Trie 类:

  • Trie() 初始化前缀树对象。
  • void insert(String word) 向前缀树中插入字符串 word 。
  • boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
  • boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。

代码说明

这是比较经典的, 应该很快写出来, 通过数组来实现树的结构
写法: 先定义TrieNode, 然后再写插入和查询的方法.

class TrieNode{
    TrieNode[] children;
    boolean isEnd;

    public TrieNode(){
        children = new TrieNode[26];
        isEnd = false;
    }
 }

class Trie {
    private TrieNode root;

    public Trie() {
        root = new TrieNode();
    }
    
    public void insert(String word) {
        TrieNode cur = root;
        for(int i =0; i < word.length(); i++){
            char c = word.charAt(i);
            int index = c - 'a';
            if(cur.children[index] == null){
                cur.children[index] = new TrieNode();
            }
            cur = cur.children[index];
        }
        cur.isEnd = true;
    }
    
    public boolean search(String word) {
        TrieNode cur = root;
        for(int i =0; i < word.length(); i++){
            char c = word.charAt(i);
            int index = c - 'a';
            if(cur.children[index] == null){
                return false;
            }
            cur = cur.children[index];
        }
        return cur.isEnd;
    }
    
    public boolean startsWith(String prefix) {
        TrieNode cur = root;
        for(int i =0; i < prefix.length(); i++){
            char c = prefix.charAt(i);
            int index = c - 'a';
            if(cur.children[index] == null){
                return false;
            }
            cur = cur.children[index];
        }
        return true;
    }
}

/**
 * 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);
 */

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

题目链接

题目说明

请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。

实现词典类 WordDictionary :

  • WordDictionary() 初始化词典对象
  • void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配
  • bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回 false 。word 中可能包含一些 ‘.’ ,每个 . 都可以表示任何一个字母。

在这里插入图片描述

代码说明

这一题再原有的基础上变化了, 在搜索的时候出现了 “.” 能够匹配任意项, 需要用到DFS算法.

DFS和回溯很像, 但是也有不同的, 就是不需要回退. 然后递推公式就为

if(child != null && dfs(child, index + 1, word)){ return true;}

学习新的方法

Character.isLetter(ch)

class TrieNode{
    TrieNode[] children;
    boolean isEnd;

    public TrieNode(){
        children = new TrieNode[26];
        isEnd = false;
    }
}

class WordDictionary {
    private TrieNode root;

    public WordDictionary() {
        root = new TrieNode();
    }
    
    public void addWord(String word) {
        TrieNode cur = root;
        for(int i =0; i < word.length(); i++){
            char c = word.charAt(i);
            int index = c - 'a';
            if(cur.children[index] == null){
                cur.children[index] = new TrieNode();
            }
            cur = cur.children[index];
        }
        cur.isEnd = true;
    }

    public boolean dfs(TrieNode node, int index, String word){
        if(index == word.length()){
            return node.isEnd;
        }

        char ch = word.charAt(index);
        if(Character.isLetter(ch)){
            int charIndex = ch - 'a';
            TrieNode child = node.children[charIndex];
            if(child != null && dfs(child, index + 1, word)){
                return true;
            }
        }else{
            // 遍历这一层
            for(int i = 0; i < 26; i++){
                TrieNode child = node.children[i];
                if(child!=null && dfs(child, index + 1, word)){
                    return true;
                }
            }
        }
        return false;
    }
    
    public boolean search(String word) {
        return dfs(root, 0, word);
    }
}

/**
 * Your WordDictionary object will be instantiated and called as such:
 * WordDictionary obj = new WordDictionary();
 * obj.addWord(word);
 * boolean param_2 = obj.search(word);
 */

Leetcode 648. 单词替换

题目链接

题目说明

在英语中,我们有一个叫做 词根(root) 的概念,可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。

现在,给定一个由许多词根组成的词典 dictionary 和一个用空格分隔单词形成的句子 sentence。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。

你需要输出替换之后的句子。

在这里插入图片描述

代码说明

字节面试题
用前缀树实现的话变动的其实只有查询的方法

class TrieNode{
    TrieNode[] children;
    boolean isEnd;

    public TrieNode(){
        children = new TrieNode[26];
        isEnd = false;
    }
}
class Solution {

    TrieNode root = new TrieNode();

    public void add(String s){
        TrieNode cur = root;
        for(int i = 0; i < s.length(); i++){
            char ch = s.charAt(i);
            int index = ch - 'a';
            if(cur.children[index] == null){
                cur.children[index] = new TrieNode();
            }
            cur = cur.children[index];
        }
        cur.isEnd = true;
    }

    public String query(String s){
        // 查找s对应的词根, 如果有就返回词根, 没有找到就返回自己
        TrieNode cur = root;
        for(int i = 0; i < s.length(); i++){
            int index = s.charAt(i) - 'a';
            if(cur.children[index] == null) break;
            if(cur.children[index].isEnd) return s.substring(0, i+1);
            cur = cur.children[index];
        }
        return s;
    }



    public String replaceWords(List<String> dictionary, String sentence) {
        for(String str : dictionary){
            add(str);
        } 
        StringBuilder sb = new StringBuilder();
        for(String word : sentence.split(" ")){
            System.out.println(query(word));
            sb.append(query(word)).append(" ");
        }
        return sb.substring(0, sb.length() -1);

    }
}



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

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

相关文章

2023-07-19 平面坐标下判断三角形以及输出周长和面积

平面坐标下判断三角形以及输出周长和面积 前言一. 基本知识总结 前言 平面坐标下判断三角形以及输出周长和面积, 用线性代数的简单知识. 一. 基本知识 在平面坐标, 三个点就是三个向量, 可以通过两个向量同时减去第三个向量, 形成一个顶点在原点的三角形. 我们发现, 只有一种…

详解C#开发Android应用程序的流程

Android系统一下子铺天盖地而来&#xff0c;让人目不暇接。兴奋的同时也让部分开发人员犯难了&#xff01;要知道从熟知的Wince、Mobile开发语言C#跨越到RFID-Android的Java。可不是一朝一夕就能完成的。就好比你的乾坤大挪移已经第七层了&#xff0c;却忽然要你从易筋经从头练…

LiveGBS流媒体平台GB/T28181功能-报警信息报警订阅配置报警预案告警触发报警时截图及录像

LiveGBS国标GB/T28181报警信息报警订阅配置报警预案告警触发报警时截图及录像 1、报警信息1.1、报警查询1.2、配置开启报警订阅1.2.1、国标设备编辑1.2.2、选择开启报警订阅 1.3、配置摄像头报警1.3.1、配置摄像头报警通道ID1.3.2、配置摄像头开启侦测1.3.3、尝试触发摄像头报警…

Fofa搜索技巧(理论加实践的整理)

目录 题记技巧&#xff08;我一般找国内的&#xff0c;所以下边一直加cn&#xff09;1、搜索HTTP响应头中含有"thinkphp"关键词的网站和IP。2、加上标题带有后台的。3、加上时间&#xff0c;现在新网站有thinkphp日志泄露的有很多。4、搜索html正文中含有"管理…

macboock Air mac系统phpstudy安装php8操作

现在mac的phpstudy的php版本只能到7.3&#xff0c;而有的网站需要8.0以上的版本&#xff0c;那就要手动进行安装 安装后的效果 操作一 安装php8.2的版本 brew install php8.2完成后的地址 /usr/local/Cellar/php/8.2.8 进入/usr/local/Cellar/php/&#xff0c;复制整个文件…

通过监控平台提高运维效率、降低运营成本、实现绿色低碳、节能降耗、提升PUE值-安科瑞黄安南

01引言 近年来&#xff0c;随着母线槽在建筑及工厂的配电中越来越广泛&#xff0c;母线槽场景运用得越多&#xff0c;随着数据中心建设的快速发展和更高需求&#xff0c;智能母线系统逐渐被应用于机房的末端配电中&#xff0c;具有电流小、插接方便、智能化程度高等特点&#…

【深度学习论文阅读】四大分类网络之AlexNet

ImageNet Classification with Deep Convolution Nerual Networks 论文原文&#xff1a;ImageNet Classification with Deep Convolutional Neural Networks 1 引言 解决的问题&#xff1a; 提高效率&#xff08;GPU训练&#xff09;&#xff0c;防止过拟合&#xff08;drop…

VCSEL器件的常见参数有哪些?如何测试?

概述 垂直腔面发射激光器(VCSEL)是一种激光发射方向垂直于P-N结平面,而谐振腔面平行于P-N结平面的半导体激光器,它属于面发射激光器的一种。而EEL边射型激光器的光则是沿着水平方向,由芯片的边缘射出。与EEL相比, VCSEL的生产过程更具经济效益并且响应快,因此在越来越多的应用中…

cocosCreator笔记 之Android打包

版本&#xff1a; v3.4.0 环境&#xff1a; Mac 简介 cocosCreator打包APK包&#xff0c;需要AndroidStudio 4.1版本以上的支持&#xff0c;不支持Eclipse的ANT构建。大概的环境配置&#xff1a; 下载Java SE Development Kit 8 Downloads , 安装JAVA环境下载 Android Studi…

让 AI 真正读懂人类语言,5分钟搞懂 word embedding 技术

大家好啊&#xff0c;我是董董灿。 在学习自然语言处理(NLP&#xff0c;Natural Language Processing)时&#xff0c;最先遇到的一个概念&#xff0c;可能就是词嵌入(word embedding)了。 词嵌入&#xff0c;是让AI真正理解人类自然语言的技术(看完本文再回过头来看这句话&am…

【分布式系统案例课】计数服务之计数服务设计

计数服务如何实现 回顾需求 对于可扩展&#xff1a;对写入的数据进行分区。 对于高性能&#xff1a;借助缓存技术的处理&#xff0c;为了提高吞吐量&#xff0c;需要做批量batch批处理 对于高可靠&#xff1a;不丢数据&#xff0c;需要对数据进行持久化&#xff0c;还要借助复…

After Effects(AE)如何选择电脑硬件?

处理器&#xff08;CPU&#xff09; 处理器&#xff08;或 CPU&#xff09;是 After Effects 工作站最重要的部件之一。虽然 GPU 加速越来越受欢迎&#xff0c;但现在您选择的 CPU 通常会对整体系统性能产生更大的影响。然而&#xff0c;After Effects 使用 CPU 的方式意味着仅…

github.com网站提示无法访问此页面——亲测有效(已解决)

最近在看stepin-template的vue3版本&#xff0c;发现这个后台框架还是有很多不足的地方。于是想要提交一个关于菜单折叠展开的issue。 但是一打开github.com网站&#xff0c;就提示下图了&#xff1a; 于是百度搜索解决办法&#xff1a; 附上大神提供的解决办法&#xff1a;g…

Navicat分配子用户及权限管理

一、创建用户&#xff0c;分配权限 新建用户 输入要创建的子用户的信息 主机名 表示访问本服务的方式&#xff0c;%表示即可以本机访问&#xff0c;也可以远程访问 之后&#xff0c;我们给创建的用户分配权限&#xff08;在该数据库的可操作空间&#xff09; 为用户分配增删改…

SciencePub学术 | 计算机语音类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 计算机语音类重点SCIE&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 计算机语音类重点SCIE 【期刊简介】IF&#xff1a;4.0-4.5&#xff0c;JCR2区&#xff0c;中科院3区&#xff1b; 【出版社】世…

结构型模式 - 桥接模式

概述 现在有一个需求&#xff0c;需要创建不同的图形&#xff0c;并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系&#xff1a; 我们可以发现有很多的类&#xff0c;假如我们再增加一个形状或再增加一种颜色&#xff0c;就需要创建更多的类。 试想…

数据结构(王道)——数据结构之 树

一、数据结构-树的定义 树的概念补充&#xff1a; 树型逻辑结构图 结点之间的关系描述 结点、树的属性描述&#xff1a; 有序树、无序树&#xff1a; 树和森林&#xff1a; 树的总结&#xff1a; 二、树的性质 概念总结&#xff1a;

2023年四川大学生程序设计竞赛-K.倒转乾坤

Cuber QQ 现在手上有两个圆环&#xff0c;其中小圆环的直径是 d&#xff0c;大圆环的直径是 2d 。他将小圆环放在大圆环内&#xff0c; 并让小圆环紧贴大圆环内壁进行无滑动的滚动。 Cuber QQ 总是喜欢动态的美&#xff0c;他在小圆环上等间隔地标记了 n 个点&#xff0c;他想…

存储服务的演化与MySQL分库分表

文章目录 一、存储服务的演化1.单体结构2.单表单库的数据量膨胀 -> 分库分表3.单个MySQL的读写压力过大 -> MySQL索引优化4.进一步缓解MySQL读写压力 -> 读写分离5.冷热数据分离 -> 使用Redis缓存 二、MySQL分库分表1.策略2.需要注意的问题 一、存储服务的演化 1.…

「深度学习之优化算法」(十六)万有引力算法

1. 万有引力算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读) 万有引力算法(Gravitational Search Algorithm)是受物体之间的万有引力启发而提出的算法。算法提出于2008(2009)年,时间不长,不过相关的文章和应用已经相对较多,也有不少的优化改进方案。   万…