1. 程式人生 > >字典樹Trie樹

字典樹Trie樹

bool cnblogs 博客 記錄 com strlen www dto fin

摘自大佬博客

https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html

給出n個單詞和m個詢問
1.查詢某個前綴是否出現過
2.查詢某個單詞是否出現過
3.查詢前綴出現的次數

例如:
cat,cash,app,apple,aply,ok 建一顆字典樹

技術分享圖片


這裏有兩種編號:
1.相對整棵樹而言(根據單詞insert順序 dfs序)

2.相對於每個節點而言

也就是說每個節點其實都開了26條分支
k=trie(i,j): 表示i號節點第j號分支的值為k
sum[i]:記錄i節點被多少個單詞經過(且記錄的是後一個節點的位置!)

建樹,插入函數

int tot=0;//記錄1類編號

void insert(char *s){
len=strlen(s);
root=0;
For(i,0,len-1){
int id=s[i]-‘a‘;
if(!trie[root][id])trie[root][id]=++tot;
sum[trie[root][id]]++; //註意是在後一個點位置+1
root=trie[root][id];
}
vis[root]=1;
}


查詢前綴或者單詞是否出現
//查單詞要多用個vis[]標記下結束點

bool find(char *s){
int rt=0;
For(i,0,strlen(s)-1){
int id=s[i]-‘a‘;
if(!trie[rt][id])return false;

rt=trie[rt][id];
}
//if(vis[rt])return true;//查單詞
return true;//查前綴
}


查詢前綴出現次數

int search(char *s){
int rt=0;
For(i,0,strlen(s)-1){
int id=s[i]-‘a‘;
if(!trie[rt][id])return 0;
rt=trie[rt][id];
}
return sum[rt];
}

字典樹Trie樹