Trie树

Posted bounce

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Trie树相关的知识,希望对你有一定的参考价值。

很多时候以为自己能记得做过的题目,可是实际上做过了几乎就不记得了。。。。。。。sad,于是还是记录一下吧。

 

题目:

对于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。

样例输入

5
babaab
babbbaaaa
abba
aaaaabaa
babaababb
5
babb
baabaaa
bab
bb
bbabbaab

算法:
记录一个Trie树,trie树的struct的内容包括,节点的内容,Trie *next[26],因为有26个字母,一个ans记录访问过的次数。

分为两步,1:依次读取每条字符串,记录节点,若节点数据为null则记录,对于每个字符cnt++。
2.判断出现的次数,直接依次读取,知道访问到了那个节点,得到节点的cnt.

实现:
 1 #include <iostream>
 2 #include <string>
 3 #include <cstring>
 4 #include <cmath>
 5 using namespace std;
 6 const int MAXN=105;
 7 
 8 struct Trie{
 9     char ch;
10     int cnt;
11     Trie *next[26];
12     Trie(){
13         cnt=0;
14         for(int i=0;i<26;i++){
15             next[i]=NULL;
16         }
17    }
18 };
19 Trie root;
20 int ans;
21 void insertWord(char *str){
22     int len=strlen(str);
23     Trie *head=&root;
24     for(int i=0;i<len;i++){
25         int idx=str[i]-a;
26         if(head->next[idx]==NULL){
27         Trie * node=new Trie;
28         node->ch=str[i];
29             head->next[idx]=node;
30         }
31         head=head->next[idx];
32         head->cnt++;
33         
34     }
35 }
36 void queryWord(char *str){
37     Trie* head=&root;
38     int len=strlen(str);
39     ans=0;
40     for(int i=0;i<len;i++){
41         int idx=str[i]-a;
42         if(head->next[idx]==NULL)return ;
43         else{
44             head=head->next[idx];
45         }
46     }
47     ans=head->cnt;
48 }
49 int main(int argc, const char * argv[]) {
50     char str[MAXN];
51     int n,m;
52     cin>>n;
53     for(int i=0;i<n;i++){
54         cin>>str;
55         insertWord(str);
56     }
57     cin>>m;
58     for(int i=0;i<m;i++){
59         cin>>str;
60         ans=0;
61         queryWord(str);
62         cout<<ans<<endl;
63     }
64 }

 



以上是关于Trie树的主要内容,如果未能解决你的问题,请参考以下文章

trie树

trie树

Trie树(字典树)整理

Trie树详解(转)

java刷题--208Trie前缀树

java刷题--208Trie前缀树