C++实现字典树数据结构_LeetCode820_字典的压缩编码

用C++实现字典树数据结构的例子:

例题:

  1. 单词的压缩编码

    给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A

例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#"indexes = [0, 2, 5]

对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表。

那么成功对给定单词列表进行编码的最小字符串长度是多少呢?

示例:

输入: words = ["time", "me", "bell"]
输出: 10
说明: S = "time#bell#" , indexes = [0, 2, 5] 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/short-encoding-of-words



本题是一个典型的字典树问题。这里对力扣官方给出的题解代码给出注释与解读(实现细节有改动)。关于字典树的原理,也可参见该链接:

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/short-encoding-of-words/solution/dan-ci-de-ya-suo-bian-ma-by-leetcode-solution/

class TrieNode{	//字典树数据结构建立
    TrieNode* children[26];
public:
    int count; //标记本节点拥有的孩子节点数
    TrieNode(){//初始化
        for(int i = 0; i < 26; i++){
            children[i] = NULL;
        }
        count = 0;
    }
    TrieNode* get(char c){//查找一个孩子节点:若有则返回该节点,否则创造该孩子节点
        if(children[c - ‘a‘] == NULL){
            children[c - ‘a‘] = new TrieNode();
            count++;
        }
        return children[c - ‘a‘];
    }
};

class Solution {
public:
    int minimumLengthEncoding(vector<string>& words) {
        TrieNode* trie = new TrieNode();
        unordered_map<TrieNode*, int> mp; //建立字典树节点到单词数组的映射
        for(int i = 0; i < (int)words.size(); i++){
            string word = words[i]; //选取一个单词
            TrieNode* cur = trie;
            for(int j = (int)word.size() - 1; j >= 0; j--){//逆序地加入单词中的字符,构成前缀树
                cur = cur->get(word[j]);
            }				//将该单词中所有的字符依次检索或者插入到字典树内
            mp[cur] = i;	//标记字典树中节点对应的单词
        }
        int ans = 0;
        for(auto& m: mp){
            if(m.first->count == 0){//若哈希表中某节点没有孩子,那么意味着这个节点是单词的首字母
                ans += (int)words[m.second].length() + 1;//构造压缩编码
            }
        }
        return ans;
    }
};

原文地址:https://www.cnblogs.com/moonwalker-hank/p/12653100.html

时间: 2024-10-07 15:11:33

C++实现字典树数据结构_LeetCode820_字典的压缩编码的相关文章

字典树 | 数据结构

# 1 字典树的概念 字典树,是一种树形结构,是一种哈希树的变种.(来自度娘百科) 首先,字典树的每一个节点都是长这样的: struct node{ int end,son[27]; }a[maxn] 每个节点都有一个判断自己是多少个单词结尾的end与它之后的节点son[27]. # 2 如何构造字典树 假设我们输入: 7 b ab ba bb aab baa aba 我们会得到一个这样的结果: 我们可以轻松地找出每个节点的end值,如下: 这样,我们就成功构建了一棵字典树! # 3 例题 例题

字典树与01字典树

之前在做一道关于字符串匹配的题时,用到了字典树,但那时是用指针实现的,这次又遇到需要使用字典树这一结构的题,向学姐要了她的板子,学习了用数组实现的方法,对于解题而言,更为简短快速. 因为题目要求最大异或和,因此用的是01字典树,在字典树的基础上稍作修改. 以下为字典树和01字典树的普遍实现: 字典树 #include<iostream> #include<algorithm> using namespace std; struct Trie { static const int N

字典树 - 神奇的字典

Description 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:   1.insert : 往神奇字典中插入一个单词   2.delete: 在神奇字典中删除所有前缀等于给定字符串的单词   3.search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串 Input 这里仅有一组测试数据.第一行输入一个正整数N (1 <= N <= 100000),代表度熊对于字典的操作次数,接下来N行,每行包含两个字符串,中间中用空格隔开.第一个字符串代表了相关的操作(包括: i

【统计难题】【HDU - 1251】【map打表或字典树】【字典树模板】

思路 题意:题目为中文题,这里不再过多阐述. 思路1:可以在读入单词表的过程中将单词分解,用map将它一 一记录 思路2:利用字典树,这个方法较快些,下面代码中会分别给出数组和结构体指针两种形式的字典树,指针形式的有时可能会因题目内存限制而导致Memory Limit Exceeded,这时就可选择数组形式的.不过对于本题来说不用担心. AC代码 代码1:map打表 #include<bits/stdc++.h> using namespace std; typedef long long L

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

简述字典树

字典是用来查阅某一个字或词的,所谓字典树也就是用于查找某一个数字序列或字符串的.字典树又称Trie树,是一种用树状结构存储字符串的数据结构,经典题目有最长公共前缀.单词统计等. 字典树的存储 字典树的存储原理可见下图.树的根节点什么都不存,接下来每一层的一个节点存储一个字母(或数字),直到将所有的字符串存储完毕. 上图中的字典树存储了ans.alpha.cry.bee.beef五个单词. 由上图可以看出,以小写字母为例,字符串在存储时先按照每个单词的首字母分为若干个节点,首字母相同的会进入同一个

字典树的基础,以及在实际项目中对于敏感词的替换的应用

最近刷题时连续遇到两道字典树的题目,所以做一下这个数据结构的总结. 首先什么叫做字典树? 叫 是 我   想 看 听 这种树结构并且把文字或者英文放在里面组成的叫做字典树. 那么字典树有什么用呢? 通过几道题目的练习我发现,字典树主要应用在,对于字符串的分级匹配和查询. 比如在我们如果有三句话,1:我是人,2:我是男人,3:我是中国人 如果一般的我们用三个字符串去存放他们,然后当我们要寻找在这些字符串中是否存在我是中国人的时候,那么就需要一句句匹配过来,如果有1000条这样的数据,那么匹配的速度

字典树 trie

字典树数据结构实现 1 public class Trie { 2 //字典树子节点最多值,任意一个单词都是由,26个字母组成的 3 private int SIZE = 26; 4 //根节点 5 private TrieNode root; 6 //初始化字典树 7 public Trie() { 8 root = new TrieNode(); 9 } 10 11 //字典树节点 12 private class TrieNode{ 13 //存放子节点的数组 14 private Tri

字典树(模板)

Trie树(来自单词retrieval),又称前缀字,单词查找树,字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构. 字典树是处理字符串常见的一种树形数据结构,其优点是利用字符串的公共前缀来节约存储空间 字典树完整结构 实际上每个节点的子节点都应该从0编到——25,但这样会发现许多事根本用不到的.比如上图的根节点应该分出26个叉.节约空间,用到哪个分哪个. 字典树建树: 字典树理解 模板: 一.建树 void insert()//插入单词s { len=strlen(s