最近在搞搞Trie,写篇博客总结一下吧.
Trie就是将字符串的每个字符用树的边储存,查询时只要沿着根节点往下爬。
Trie的根节点为空,表示空串.
----------------------------------------------------------------------------------------------------
在详细的操作前,我们先了解一下几个数组。
trie[u][c]=x表示编号为u的节点的第c个孩子编号为x.
这里的编号有两个含义,u,x表示字符插入trie时的顺序编号,c表示这个字符在其字符集中的编号(如a表示1,b表示2....)
f[u]表示这个插入的单词是否以u结尾。
如图
u,x为红色标号,c为蓝色编号
Trie具体上有两个操作:
插入
1 void insert(char *s) { 2 3 int u=1; int len=strlen(s); //u=1表示根节点 4 5 for (int i=0;i<len;i++){ 6 7 int c=s[i]-'a';//计算c编号 8 9 if (!trie[u][c]) trie[u][c]=++tot;//如果字符未出现则插入 10 11 u=trie[u][c];//根节点指向下一位 12 13 } 14 15 f[u]=true;//给单词末尾打上标记 16 17 }
查询
1 bool find(char *s) 2 { 3 int u=1; 4 int len=strlen(s); 5 for (int i=0;i<len;i++){ 6 int c=s[i]-'a'; 7 if (!trie[u][c]) { 8 return false;//查询单词是否出现 9 break; 10 } 11 u=trie[u][c]; 12 } 13 return true; 14 }
查询操作中我们也可以添加数组查询前缀个数等等,但大体思路都是沿着根往下查询统计.
----------------------------------------------------------------------------------------------------
题目练习:
1.