[前缀树]leetcode208:实现前缀树(medium)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43152052/article/details/100586268

题目:
在这里插入图片描述
题解:
字母树的插入(Insert)、删除( Delete)和查找(Find)都非常简单,用一个一重循环即可,即第i 次循环找到前i 个字母所对应的子树,然后进行相应的操作。实现这棵字母树,我们用最常见的数组保存(静态开辟内存)即可,当然也可以开动态的指针类型(动态开辟内存)。至于结点对儿子的指向,一般有三种方法:

1、对每个结点开一个字母集大小的数组,对应的下标是儿子所表示的字母,内容则是这个儿子对应在大数组上的位置,即标号;
2、对每个结点挂一个链表,按一定顺序记录每个儿子是谁;
3、使用左儿子右兄弟表示法记录这棵树。

三种方法,各有特点。第一种易实现,但实际的空间要求较大;第二种,较易实现,空间要求相对较小,但比较费时;第三种,空间要求最小,但相对费时且不易写。
我们这里只来实现第一种方法,这种方法实现起来简单直观,字母的字典树每个节点要定义一个大小为 26 的子节点指针数组,然后用一个标志符用来记录到当前位置为止是否为一个词,初始化的时候讲 26 个子节点都赋为空。那么 insert 操作=只需要对于要插入的字符串的每一个字符算出其的位置,然后找是否存在这个子节点,若不存在则新建一个,然后再查找下一个。查找词和找前缀操作跟 insert 操作都很类似,不同点在于若不存在子节点,则返回 false。查找词最后还要看标识位,而找前缀直接返回 true 即可。

代码如下:

class Trie {
private:
    bool is_string;//当前节点是否为一个完整的字符串
    Trie *next[26];//每个节点有26链接
public:
    
    /** Initialize your data structure here. */
    Trie() {
        is_string=false;
        memset(next,0,sizeof(next));//为next分配4个字节的内存空间
    }
    
    /** Inserts a word into the trie. */
    void insert(string word) {
        Trie* root=this;//根节点,根节点的节点值为空
        for(const auto & w:word)//遍历字符串的每一个字符,若下一个节点不存在,则添加一个新节点
        {
            if(root->next[w-'a']==nullptr){root->next[w-'a']=new Trie();}
            root=root->next[w-'a'];//根节点更新为新节点
        }
        root->is_string=true;//该字符串为完整的字符串
    }
    
    /** Returns if the word is in the trie. */
    bool search(string word) {
        Trie* root=this;//根节点
        for(const auto & w:word)//遍历字符串,root每次更新为字符串中的节点值
        {
            if(root!=nullptr)root=root->next[w-'a'];
        }
        return (root!=nullptr&&root->is_string);
    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    bool startsWith(string prefix) {
        Trie* root=this;//根节点
        for(const auto & w:prefix)//遍历字符串,root每次更新为字符串中的节点值(字符)
        {
            if(root!=nullptr)root=root->next[w-'a'];
        }
        return (root!=nullptr);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/100586268
今日推荐