IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode刷题 - task2 - 字典树知识 -> 正文阅读

[数据结构与算法]Leetcode刷题 - task2 - 字典树知识

Leetcode刷题 - task2 - 字典树知识

1. 字典树知识:

简介:

字典树(Trie):又称为前缀树、单词查找树,是一种树形结构。顾名思义,就是一个像字典一样的树。它是字典的一种存储方式。字典中的每个单词在字典树中表现为一条从根节点出发的路径,路径相连的边上的字母连起来就形成对应的字符串。

它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

性质:

  • 根节点不包含字符,除根节点外每一个节点都只包含一个字符;
  • 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
  • 每个节点的所有子节点包含的字符都不相同。

示例:

img

基本操作:

字典树的基本操作有 创建插入查找删除。其中删除操作是最不常用,我们这里主要介绍字典树的创建、插入和查找。

字典树的节点结构:

首先,来定义一下字典树的节点结构,这里即可以使用数组,也可以使用哈希表来表示当前节点的多个子节点。

class Node:
    # 初始化字符节点
    def __init__(self):
        # 初始化子节点
        self.children = dict()
        # 或者 self.children = {}
        # 如果使用数组:self.children = [None for _ in range(26)]

        # isEnd 用来标记单词结束
        self.isEnd = False

字典树的基本结构:

在字典树的初始化操作时,定义一个根节点。这个根节点不用保存字符,在后续进行插入操作、查找操作都是从字典树的根节点开始的。

class Trie:
    # 初始化字典树
    def __init__(self):
        # 初始化根节点(根节点不保存字符)
        self.root = Node()

字典树的插入操作:

    def insert(self, word):
        cur = self.root 
        for ch in word:
            if ch not in cur.children:
                cur.children[ch] = Node() 
            cur = cur.children[ch]
        cur.isEnd = True

字典树的查找单词操作:

    def search(self, word):
        cur = self.root 
        for ch in word:
            if ch not in cur.children:
                return False 
            cur = cur.children[ch]
        return cur is not None and cur.isEnd 

字典树的查找前缀操作:

    def startsWith(self, prefix):
        cur = self.root
        for ch in prefix:
            if ch not in cur.children:
                return False
            cur = cur.children[ch]
        return cur is not None

整理一下,就可以得到字典树的Python的代码实现。

class Node:
    def __init__(self):
        self.children = dict()
        self.isEnd = False 


class Trie:
    def __init__(self):
        self.root = Node()
    
    def insert(self, word):
        cur = self.root 
        for ch in word:
            if ch not in cur.children:
                cur.children[ch] = Node()
            cur = cur.children[ch]
        cur.isEnd = True 
    
    def search(self, word):
        cur = self.root 
        for ch in word:
            if ch not in cur.children:
                return False 
            cur = cur.children[ch]
        return cur is not None and cur.isEnd 
    
    def startsWith(self, prefix):
        cur = self.root 
        for ch in prefix:
            if ch not in cur.children:
                return False
            cur = cur.children[ch]
        return cur is not None 

2. 相关LeetCode例题:

题号 标题 题解链接 标签 难度 0208 实现?Trie?(前缀树) Python 设计、字典树、哈希表、字符串 中等 0677 键值映射 Python 设计、字典树、哈希表、字符串 中等 1023 驼峰式匹配 Python 字典树、双指针、字符串、字符串匹配 中等 0211 添加与搜索单词?-?数据结构设计 Python 深度优先搜索、设计、字典树、字符串 中等 0648 单词替换 Python 字典树、数组、哈希、字符串 中等 0676 实现一个魔法字典 Python 设计、字典树、哈希表、字符串 中等 \begin{array}{c|c|c|c|c} \hline \text{题号} & \text{标题} & \text{题解链接} & \text{标签} & \text{难度}\\ \hline \text{0208} & \text{实现 Trie (前缀树)} & \text{Python} & \text{设计、字典树、哈希表、字符串} & \text{中等}\\ \text{0677} & \text{键值映射} & \text{Python} & \text{设计、字典树、哈希表、字符串} & \text{中等}\\ \text{1023} & \text{驼峰式匹配} & \text{Python} & \text{字典树、双指针、字符串、字符串匹配} & \text{中等}\\ \text{0211} & \text{添加与搜索单词 - 数据结构设计} & \text{Python} & \text{深度优先搜索、设计、字典树、字符串} & \text{中等}\\ \text{0648} & \text{单词替换} & \text{Python} & \text{字典树、数组、哈希、字符串} & \text{中等}\\ \text{0676} & \text{实现一个魔法字典} & \text{Python} & \text{设计、字典树、哈希表、字符串} & \text{中等}\\ \hline \end{array} 题号020806771023021106480676?标题实现?Trie?(前缀树)键值映射驼峰式匹配添加与搜索单词?-?数据结构设计单词替换实现一个魔法字典?题解链接PythonPythonPythonPythonPythonPython?标签设计、字典树、哈希表、字符串设计、字典树、哈希表、字符串字典树、双指针、字符串、字符串匹配深度优先搜索、设计、字典树、字符串字典树、数组、哈希、字符串设计、字典树、哈希表、字符串?难度中等中等中等中等中等中等??


3. 参考资料:

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-25 11:42:15  更:2022-05-25 11:43:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 -2025/2/6 5:43:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码