字典树-Trie


目录

Trie树基本概念

力扣208:实现前缀树

实现代码

测试结果:



Trie树基本概念

Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。它的key都为字符串,能做到高效查询和插入,时间复杂度为O(k),k为字符串长度,缺点是如果大量字符串没有共同前缀时很耗内存。它的核心思想就是通过最大限度地减少无谓的字符串比较,使得查询高效率,即「用空间换时间」,再利用共同前缀来提高查询效率。

 

实际存储结构如图

 

力扣208:实现前缀树

实现代码

//Trie的节点:val child isEndOfChild
class TrieNode{
    public:
    char val;
    bool isEndOfWord;
    TrieNode*child[26];
    TrieNode()
    {
        isEndOfWord = false;
        for(int i = 0;i<26;i++)
            child[i] = nullptr;
        val = '/';
    }
    TrieNode(char c)
    {
        isEndOfWord = false;
        for(int i = 0;i<26;i++)
            child[i] = nullptr;
        val = c;
    }
};
class Trie {
private:
    TrieNode* root;
public:
    /** Initialize your data structure here. */
    Trie() { 
        root = new TrieNode();
    }
    /** Inserts a word into the trie. */
    void insert(string word) {
        if(word == "")return;
        
        int len = word.size();
        TrieNode*p = root;
        for(int i = 0;i<len;++i)
        {
            if((p->child)[word[i]-'a'] == nullptr)
            {
                (p->child)[word[i]-'a'] = new TrieNode(word[i]);
                p =  (p->child)[word[i]-'a'];
            }
            else
                p = (p->child)[word[i]-'a'];
        }
        p->isEndOfWord = true;
        
    }
    /** Returns if the word is in the trie. */
    bool search(string word) {
        if(word == ""||root == nullptr)
            return false;
        TrieNode*p = root;
        for(int i = 0;i<word.size();++i)
        {
            if((p->child)[word[i]-'a']!=nullptr)
                p = (p->child)[word[i]-'a'];
            else
                return false;
        }
        return p->isEndOfWord == true?true:false;
        
    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    bool startsWith(string prefix) {
        if(prefix == ""||root == nullptr)
            return false;
        TrieNode*p = root;
        for(int i = 0;i<prefix.size();++i)
        {
            if((p->child)[prefix[i]-'a'] != nullptr)
                p = (p->child)[prefix[i] - 'a'];
            else
                return false;
        }
        return true;
    }
};

测试结果:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值