字典树实现

news2024/11/14 16:22:56

一、字典树

字典树(Trie树)是一种多叉树结构,每条边代表一个字符,从根节点到其它节点的路径构成一个单词。其具有较好的查询性能,可以用于有效地存储大量字符串,并支持高效的查找、插入和删除操作。

二、代码实现

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ALPHABET_SIZE 26  //字母表长度

// 字典树的节点结构
typedef struct TrieNode {
    struct TrieNode *children[ALPHABET_SIZE];
    int isEndOfWord;
} TrieNode;

// 初始化字典树节点
TrieNode* createNode() {
    TrieNode *node = (TrieNode*)malloc(sizeof(TrieNode));
    node->isEndOfWord = 0;
    for (int i = 0; i < ALPHABET_SIZE; i++) {
        node->children[i] = NULL;
    }
    return node;
}

// 在字典树中插入单词
void insertWord(TrieNode *root, char *word) {
    TrieNode *current = root;
    int len = strlen(word);

    for (int i = 0; i < len; i++) {
        int index = word[i] - 'a';
        if (current->children[index] == NULL) {
            current->children[index] = createNode();
        }
        current = current->children[index];
    }

    current->isEndOfWord = 1;
}

//打印字符串
void printSubstring(const char *str, int start, int length) {  
    for (int i = start; i < start + length && str[i] != '\0'; i++) {  
        putchar(str[i]);  
    } 
    putchar('\n'); 
}  

// 在字符串中查找字典树中的单词
void searchWords(TrieNode *root, char *text) {
    int len = strlen(text);
    TrieNode *current = root;
    int wordLen = 0;

    for (int i = 0; i < len; i++) {
        int index = text[i] - 'a';
        if (current->children[index]) {
            current = current->children[index];
            ++wordLen;
            if (current->isEndOfWord) {
                printf("Word found starting at position: %d, len: %d word is ", i - wordLen + 1, wordLen);
                printSubstring(text, i - wordLen + 1, wordLen); 
            }
        } else {
            current = root;
            wordLen = 0;

        }
    }
}

int main() {
    TrieNode *root = createNode();
    char words[][10] = {"insert", "delete", "update", "select", "create", "drop"};
    int wordsCount = sizeof(words)/sizeof(words[0]);
    char text[] = "deletedeinsertlete";

    // 构建字典树
    for (int i = 0; i < wordsCount; i++) {
        insertWord(root, words[i]);
    }

    // 在文本中查找单词
    searchWords(root, text);

    return 0;
}
//编译 gcc -o tire_tree tire_tree.c

运行结果:
在这里插入图片描述

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

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

相关文章

浏览器缓存:强缓存与协商缓存实现原理有哪些?

1、强缓存&#xff1a;设置缓存时间的&#xff0c;那么在这个时间内浏览器向服务器发送请求更新数据&#xff0c;但是服务器会让其从缓存中获取数据。 可参考&#xff1a;彻底弄懂强缓存与协商缓存 - 简书 2、协商缓存每次都会向浏览器询问&#xff0c;那么是怎么询问的呢&…

java 项目使用 acitiviti 流程引擎中的人员设置

学习目标&#xff1a; 目标 [ ]了解 java 项目使用 acitiviti 流程引擎中的人员设置 知识小记&#xff1a; - [x] 1、人员选择说明 - [x] 2、分配任务候选人 任务的候选人是指有权限对该任务进行操作的潜在用户群体&#xff0c;这个用户群体有权限处理(处理、完成)该任务…

第九课:服务器发布(静态nat配置)

一个要用到静态NAT的场景&#xff0c;当内网有一台服务器server1&#xff0c;假如一个用户在外网&#xff0c;从外网访问内网怎么访问呢&#xff0c;无法访问&#xff0c;这是因为外网没办法直接访问内网&#xff0c;这时候需要给服务器做一个静态NAT。 静态NAT指的是给服务器…

学习笔记——动态路由——IS-IS中间系统到中间系统(特性之路由泄漏)

3、路由泄漏 什么是路由泄漏&#xff1f; IS-IS路由协议允许路由信息的两级层次结构。可以有多个1级区域通过连续的2级主干互连。路由器可以属于1级、2级或两者。1级链路状态数据库仅包含有关该区域的信息。第2级链路状态数据库包含有关该级别以及每个第1级区域的信息。L1/L2…

Matlab|基于蒙特卡洛法的电动汽车充电负荷计算

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序方法复现《V2G 模式下含分布式能源的配电网优化运行研究》第二章电动汽车无序充电模型&#xff0c;按照文章《V2G 模式下基于复杂网络的电动汽车有序充电策略》分析思路研究了不同数量电动汽车接入情况…

初识Docker及管理Docker

Docker部署 初识DockerDocker是什么Docker的核心概念镜像容器仓库 容器优点容器在内核中支持2种重要技术&#xff1a;Docker容器与虚拟机的区别 安装Docker源码安装yum安装检查Docker Docker 镜像操作配置镜像加速器&#xff08;阿里系&#xff09;搜索镜像获取镜像查看镜像信息…

【STM32 IDE】使用STM32CubeIDE创建一个工程

关于IDE的下载安装和环境配置这里暂且不介绍&#xff0c;我们直接使用STM32F407ZGT6创建工程。 这里需要注意两点&#xff1a; 创建工程时&#xff0c;默认使用最新版本的固件包&#xff08;HAL库&#xff09;&#xff0c;好像还不让更改。如果本地电脑位置没有该版本的包&…

Porfinet从转Ethernet/IP从总线协议转换网关

产品功能 1. 远创智控YC-PN-EIP型是Porfinet从转Ethernet/IP从工业级Porfinet 网关。‌这种网关设备允许将Porfinet网络中的设备连接到Ethernet/IP网络中&#xff0c;‌从而实现不同工业通信协议之间的互操作性。‌这些网关设备通常具有两个以太网接口&#xff0c;‌分别用于连…

怎么将几个pdf合成为一个pdf?几个合并PDF文件的方法

怎么将几个pdf合成为一个pdf&#xff1f;当需要将多个PDF文件合并成一个单一的PDF文件时&#xff0c;这种操作不仅能够提高文件管理的效率&#xff0c;还能使得相关文档更加集中和易于访问。合并PDF的过程不仅仅是简单地将几个文件结合在一起&#xff0c;更是将信息整合成一个更…

达梦数据库的系统视图v$recover_status

达梦数据库的系统视图v$recover_status 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$RECOVER_STATUS 是一个系统视图&#xff0c;用于显示数据库的恢复状态信息。这个视图对于数据库管理员来说非常重要&#xff0c;尤其是在数据库发生故障需要进行恢复操…

Vue学习---vue cli 项目创建

使用的编辑工具webStorm 创建例子: hello vue create hello 选择 vue3 进行创建 运行 npm run serve 测试访问&#xff1a;http://localhost:8080 改动内容重新编译&#xff1a; npm run build dist 目录就是编译后的可运行内容

3.外部中断

文章目录 中断原理代码实现过程中断源中断处理函数中断寄存器中断控制寄存器中断优先级寄存器&#xff08;暂不学&#xff09;中断允许寄存器 中断代码 中断原理 你在打游戏&#xff0c;水开了&#xff0c;水壶发出响声&#xff0c;你停止打游戏&#xff0c;去倒水&#xff0c…

8 多输出预测与多标签分类pytorch网络搭建

文章目录 前言一、多输出预测(回归)1 坐标数据生成2 网络搭建训练预测二、多标签分类1 多标签数据生成2 网络搭建训练总结前言 前面我们搭建的无论是分类还是回归都只能预测一个标签,这显然效果很局限。下面我们想做到下面这两种效果: 多输出预测(回归):例如训练网络拟…

谷歌浏览器插件-多语言翻译插件-免费好用简单开源

使用说明&#xff1a; 基于translate.js 实现的 免费 谷歌多语言翻译插件 不能确保永久有效&#xff01; 谷歌浏览器翻译插件&#xff0c;支持中、英、日、韩、俄、中文繁体多种语言翻译~ 使用说明 &#xff1a; 第一步&#xff1a; 把收到的压缩包解压出来&#xff0c;放到…

拒绝废话:computed、watch和methods的区分和使用场景

computed、watch和methods是用于处理数据和响应数据变化的不同方式&#xff0c;三者之间有什么不同呢&#xff0c;贝格前端工场作为10年前端老司机&#xff0c;用浅显的语言给大家分享一下。 computed&#xff1a; computed属性是用来定义一个基于依赖的响应式属性。它会根据…

系统测试-白盒测试学习

目录 1、语句覆盖法&#xff1a; 2、判定覆盖法&#xff1a; 3、条件覆盖法&#xff1a; 4、判定条件覆盖&#xff1a; 5、条件组合的覆盖&#xff1a; 6、路径覆盖&#xff1a; 黑盒&#xff1a;需求 白盒&#xff1a;主要用于单元测试 1、语句覆盖法&#xff1a; 程序…

Modbus转Ethernet/IP网关模块与汇川PLC通讯案例

Modbus转Ethernet/IP网关模块&#xff08;XD-MDEP100&#xff09;是一种用于将Modbus协议转换为Ethernet/IP协议的设备。它可以将Modbus RTU和Modbus TCP两种不同格式的Modbus数据包转换为Ethernet/IP协议的数据包&#xff0c;实现不同厂家的设备之间的数据交换和共享。在汇川P…

力扣2296.设计一个文本编辑器

力扣2296.设计一个文本编辑器 对顶栈 将光标看作左右栈的分隔添加元素&#xff1a;往左栈添加元素删除元素&#xff1a;从左栈删除元素光标左(右)移&#xff1a;左(右)栈元素加到右(左)栈 class TextEditor {string left,right;public:TextEditor() {}void addText(string…

理兔chat开发日记

1.注册 注册跟以前的差不多&#xff0c;我们将我们的验证码放在redis下&#xff0c;我们在注册的时候先判断我们输入的验证码是否正确 验证码成功后在我们的实现类中&#xff0c;我们先判断邮箱是否重复&#xff0c;不重复我们就继续注册 我们拥有联号注册的功能&#xff0c;就…

OpenCV 棋盘格相机标定(保姆版)

目录 一、概述 1.1标定原理 1.2实现步骤 1.3应用场景 二、代码 2.1 cv2.calibrateCamera函数 2.1.1输入参数 2.1.2输出参数 2.2完整代码 三、实现效果 3.1处理图像 3.2内参与畸变系数 一、概述 使用 OpenCV 进行相机标定&#xff0c;通常需要拍摄多张包含棋盘格标定…