前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DS哈希查找--Trie树

DS哈希查找--Trie树

作者头像
叶茂林
发布2023-07-30 13:33:35
1920
发布2023-07-30 13:33:35
举报
文章被收录于专栏:叶子的开发者社区

题目描述

Trie树又称单词查找树,是一种树形结构,如下图所示。

它是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

输入的一组单词,创建Trie树。输入字符串,计算以该字符串为公共前缀的单词数。

(提示:树结点有26个指针,指向单词的下一字母结点。)

输入

测试数据有多组

每组测试数据格式为:

第一行:一行单词,单词全小写字母,且单词不会重复,单词的长度不超过10

第二行:测试公共前缀字符串数量t

后跟t行,每行一个字符串

输出

每组测试数据输出格式为:

第一行:创建的Trie树的层次遍历结果

第2~t+1行:对每行字符串,输出树中以该字符串为公共前缀的单词数。

输入样例1 

abcd abd bcd efg hig 3 ab bc abcde

输出样例1

 abehbcficddggd 2 1 0

AC代码

代码语言:javascript
复制
#include<iostream>
#include<sstream>
#include<vector>
#include<queue>
using namespace std;
struct Node{
    Node*next[26]={NULL};
};
class Trie{
    Node*root=new Node;
public:
    Trie(){
        string data;
        getline(cin, data);
        stringstream turn(data);
        while(turn >> data){
            int i=0;
            Node*current=root;
            while(i<data.size()&&current->next[data[i]-'a']){
                current=current->next[data[i]-'a'];
                i++;
            }
            for(;i<data.size();i++){
                Node*newOne=new Node;
                current=current->next[data[i]-'a']=newOne;
            }
        }
        BFS();
        int t;
        cin>>t;
        while(t--){
            cin>>data;
            Find(data);
        }
    }
    void BFS(){
        queue<Node*>open;
        open.push(root);
        while(!open.empty()){
            Node*current=open.front();
            open.pop();
            for(int i=0;i<26;i++)
                if(current->next[i]){
                    cout<<char(i+'a');
                    open.push(current->next[i]);
                }
        }
        cout<<endl;
    }
    void DFS(Node*current,int&count){
        bool leave=true;
        for(int i=0;i<26;i++)
            if(current->next[i]){
                leave= false;
                break;
            }
        if(leave){
            count++;
            return;
        }
        for(int i=0;i<26;i++)
            if(current->next[i])
                DFS(current->next[i],count);
    }
    void Find(string&data){
        Node*current=root;
        int i=0,count=0;
        while(i<data.size()&&current->next[data[i]-'a']){
            current=current->next[data[i]-'a'];
            i++;
        }
        if(i==data.size()){
            for(int j=0;j<26;j++)
                if(current->next[j])
                    DFS(current->next[j],count);
            cout<<count<<endl;
        }else cout<<'0'<<endl;
    }
};
int main() {
    Trie test;
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • AC代码
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档