leetcode 热题100(208. 实现 Trie (前缀树))数组模拟c++

链接:208. 实现 Trie (前缀树) - 力扣(LeetCode)

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

请你实现 Trie 类:

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

示例:

复制代码
输入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
输出
[null, null, true, false, true, null, true]

解释
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple");   // 返回 True
trie.search("app");     // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app");     // 返回 True

提示:

  • 1 <= word.length, prefix.length <= 2000
  • wordprefix 仅由小写英文字母组成
  • insertsearchstartsWith 调用次数 总计 不超过 3 * 104

题意

很明显,题目要我们实现一个trie树的查找数据结构

思路

直接数据模拟trie树数据结构,定义cnt数组来记录哪个位置出现过一个完整的单词,查找前缀的话,只要出现过的直接返回true,否则直接返回false,插入的话直接插入,模拟下一个层即可

代码

cpp 复制代码
class Trie {
public:
    int idx = 0;
    int cnt[300010]={0};    //定义cnt来记录当前位置是一个完整的单词
    int trie[300010][30];   //定义trie数组,最多调用3*10*4个数据,说明可能最大层为这么大,然后的30是定义的26个字母 0-25
    Trie() {
        
    }
    
    void insert(string word) {
        int p = 0;
        for(auto c:word){
            int val = c-'a';    //转变为0-25
            if(!trie[p][val]) trie[p][val]=++idx;   //在当前层数未出现
            p = trie[p][val];   //转为下一层
        }
        //cout<<"insert::" <<p<<endl;
        cnt[p]++;   //记录当前层的位置为一个完整单词
    }
    
    bool search(string word) {
        int p = 0;
        for(auto c:word){
            int val = c-'a';
            if(!trie[p][val]) return false; //找不到下一个位置的字母,直接返回false
            p = trie[p][val];
        }
        //cout<<word<<" "<<"search::"<<p<<endl;
        return cnt[p];  //判断当前位置是否是一个完整单词
    }
    
    bool startsWith(string prefix) {
        int p = 0;
        for(auto c:prefix){
            int val = c-'a';
            if(!trie[p][val]) return false;
            p = trie[p][val];
        }
        //没有查不到,说明是某个单词的前缀
        return true;    
    }
};

/**
 * Your Trie object will be instantiated and called as such:
 * Trie* obj = new Trie();
 * obj->insert(word);
 * bool param_2 = obj->search(word);
 * bool param_3 = obj->startsWith(prefix);
 */
相关推荐
Coovally AI模型快速验证2 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun2 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao343 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
好望角雾眠3 小时前
第一阶段C#基础-10:集合(Arraylist,list,Dictionary等)
笔记·学习·c#
zhangfeng11333 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
圣保罗的大教堂4 小时前
leetcode 2348. 全 0 子数组的数目 中等
leetcode
啊阿狸不会拉杆4 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路4 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
你知道网上冲浪吗5 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
地平线开发者6 小时前
征程 6 | PTQ 精度调优辅助代码,总有你用得上的
算法·自动驾驶