【算法复健】1225-前缀树和单词搜索

devtools/2024/12/28 7:40:36/

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、前缀树是什么?
    • 1.定义
    • 2.实现
      • a .数组
      • b.hashmap
  • 二、例题-添加与搜索单词(数据结构设计)
    • 1.题目
    • 2.思路
    • 3.代码


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、前缀树是什么?

1.定义

含义:前缀树的一个节点代表一个前缀(一个字符串),一个代表一个字符,根节点代表空字符串
特点:节点所有的后代都与该节点相关的字符串有着共同的前缀
在这里插入图片描述

2.实现

a .数组

节点只表达a-z的26个字母时,可以声明一个大小为26的数组存储子节点,用 某字符 - ‘a’ 来确定索引(ascii)

#define N 26struct TrieNode {TrieNode* children[N];
};

这种方式的优势是查找比较快,劣势是空间浪费(长度为26的数组其实只用了一个)

b.hashmap

在每个节点声明一个Hashmap,键是字符,值是对应的字节点
有时是节省空间,但可能会稍慢一些

二、例题-添加与搜索单词(数据结构设计)

1.题目

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

实现词典类 WordDictionary :

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

示例:

输入:
[“WordDictionary”,“addWord”,“addWord”,“addWord”,“search”,“search”,“search”,“search”]
[[],[“bad”],[“dad”],[“mad”],[“pad”],[“bad”],[“.ad”],[“b…”]]
输出:
[null,null,null,null,false,true,true,true]

解释:
WordDictionary wordDictionary = new WordDictionary();
wordDictionary.addWord(“bad”);
wordDictionary.addWord(“dad”);
wordDictionary.addWord(“mad”);
wordDictionary.search(“pad”); // 返回 False
wordDictionary.search(“bad”); // 返回 True
wordDictionary.search(“.ad”); // 返回 True
wordDictionary.search(“b…”); // 返回 True

2.思路

结合前缀树和dfs,对于确定的字母,直接查找,对于“.”,先序遍历所有孩子节点
前缀树用数组方式实现

3.代码

class WordDictionary {//根节点private Trie root;//构造函数public WordDictionary() {//根节点是一个Trie树节点root = new Trie();}//插入单词直接用Trie的insert方法即可public void addWord(String word) {root.insert(word);}//dfs深度优先遍历查找单词是否存在public boolean search(String word) {return dfs(word, 0, root) ; //单词的第一个字符(索引 0) 开始,递归地遍历以 root 为起点的 Trie 树}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 children = node.getChildren()[childIndex];if(children != null && dfs(word, index + 1, children)){return true;}}else{for(int i = 0; i < 26; i++){Trie children = node.getChildren()[i];if(children != null && dfs(word, index + 1, children)){return true;}}}return false;}
}// 前缀树
class Trie{private Trie[] children ; //当前节点的孩子private boolean isEnd ; //当前节点是否是单词结尾//构造函数public Trie(){children = new Trie[26];isEnd = false;}//插入单词的函数,参数是单词,没有返回值//String类的charAt函数返回字符串中指定索引位置的字母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.ppmy.cn/devtools/145465.html

相关文章

SQLite 是一个轻量级的嵌入式数据库,不需要安装服务器,直接使用文件即可。

下载 SQLite 命令行工具 访问 SQLite 官方网站。 下载适合你操作系统的命令行工具&#xff08;例如 sqlite3.exe&#xff09;。 创建 SQLite 数据库文件 打开命令行工具&#xff08;例如 Windows 的 cmd 或 PowerShell&#xff09;。 导航到你希望保存数据库文件的目录。 运…

Win11提示fveapi.dll丢失是什么原因?fveapi.dll丢失怎么办?

一、fveapi.dll丢失的成因与影响 成因&#xff1a; 系统更新不完整&#xff1a;Win11系统在更新过程中&#xff0c;如果某个环节出现问题&#xff0c;可能会导致fveapi.dll等系统文件未能正确更新或安装。软件冲突&#xff1a;某些第三方软件可能与系统文件发生冲突&#xff…

C语言-数据结构-图

目录 一,图的概念 1,图的定义 2,图的基本术语 二,图的存储结构 1,邻接矩阵 2,邻接表 三,图的遍历 1,深度优先搜索 2,广度优先搜素 四,生成树和最小生成树 1,生成树的特点: 2,最小生成树 (1)普利姆算法Prim (2)普里姆算法思路 五,最短路径 1,Dijkstra算法 2,Fl…

软考:系统架构设计师教材笔记(持续更新中)

教材中的知识点都会在。其实就是将教材中的废话删除&#xff0c;语言精练一下&#xff0c;内容比较多&#xff0c;没有标注重点 系统架构概述 定义 系统是指完成某一特定功能或一组功能所需要的组件集&#xff0c;而系统架构则是对所有组件的高层次结构表示&#xff0c;包括各…

在低版本 CUDA 环境下安装高 CUDA 版本的 PyTorch 及 DGL

项目中&#xff0c;代码环境需要 PyTorch 1.12.0 以上版本&#xff0c;但服务器上的 CUDA 版本仅为 10.1&#xff0c;官方支持的 PyTorch 最高版本为 1.7.0。导致无法直接使用所需的 PyTorch 版本。而且&#xff0c;DGL 也需要 0.9.1 版本&#xff0c;而 CUDA 10.1 不支持该版本…

8K+Red+Raw+ProRes422分享5个影视级视频素材网站

Hello&#xff0c;大家好&#xff0c;我是后期圈&#xff01; 在视频创作中&#xff0c;电影级的视频素材能够为作品增添专业质感&#xff0c;让画面更具冲击力。无论是广告、电影短片&#xff0c;还是品牌宣传&#xff0c;高质量的视频素材都是不可或缺的资源。然而&#xff…

设置postgreSQL字段自增

CREATE SEQUENCE ai_mirror_opcode_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; nextval(ai_mirror_opcode_seq) 手动创建序列并设置默认值&#xff1a; 如果你需要更细粒度的控制&#xff0c;可以手动创建一个序列&#xff0c;并将其设置为某个字段的…

Y3编辑器教程8:资源管理器与存档、防作弊设置

文章目录 一、资源管理器简介1.1 界面介绍1.2 资源商店1.3 AI专区1.3.1 AI文生图1.3.2 AI图生图1.3.3 立绘头像 二、导入导出2.1 文件格式2.2 模型导入2.2.1 模型制作后导出2.2.2 模型文件导入Y3编辑器2.2.3 Y3编辑器角色、装饰物模型要求 2.3 纹理导入2.4 材质贴图2.4.1 材质支…