zoukankan      html  css  js  c++  java
  • Trie树

    问题模型:给定一个字典中的所有单词,然后每次给出一个单词进行询问是否为字典中的单词

    对字典中的每一个单词,将这个单词转化为字典树的”一根树枝“,及从根节点往下延伸,按照顺序每个节点对应一个该单词中的字母。

    例如age,an

                                   root

            a        

           g  n

          e    

    建树:

    struct trie
    {
        trie *next[maxn];//子节点数组
        bool last;//记录此节点储存字母是否为一个单词的末尾字母
        
        trie()//构造函数初始化赋值
        {
            memset(next,0,sizeof(next));
            last = false;
        }
    };
    trie *root;
    void init()//为root分配空间
    {
      root = new trie;
    }

    插入单词:

    void insert(char s[])
    {
        trie *p = root;
        for( int i = 0; i < (int)strlen(s); ++i )
        {
            if( !p->next[s[i]-'a'] )//该字母对应节点不存在
                p->next[s[i]-'a'] = new trie;
            p = p->next[s[i]-'a'];//转移,向下继续搜索
        }
        p->last = true;//节点末尾标记为真
    }

    查询:

    bool query(char s[])
    {
        trie *p = root;
        for( int i = 0; i < (int)strlen(s); ++i )
        {
            if( !p->next[s[i]-'a'] )//无节点对应该字母
                return false;
            p = p->next[s[i]-'a'];//继续查找
        }
        if(p->last ) return true;//该单词最后一个字母为树中储存单词的结尾,并非前缀
        else return false;
    }
  • 相关阅读:
    流光shader 和 流光+扭曲shader
    unity3d android动态更新dll
    Shader之溶解效果的几种实现方法
    我的第一个法线贴图
    windows 函数
    MFC 消息框
    C++ MFC棋牌类小游戏day1
    C++STL 预定义函数对象和函数适配器
    C++STL 函数对象和谓词
    C++STL 算法
  • 原文地址:https://www.cnblogs.com/mile-star/p/10771716.html
Copyright © 2011-2022 走看看