字典树总结
定义 表示第 个点与第 字母相连的边。
-
根节点不包含字符,除根节点外每一个节点都只包含一个字符。
-
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
-
每个节点的所有子节点包含的字符都不相同。
求长度为 字符串前缀。例如某个字符串是否是另一个字符串的前缀,某一个字符串是否出现过。
假设有 种字符,则可将看成 叉树。
对插入字符串 ,当前处在点 ,在插入 时,依次进行以下操作:
-
如果 还没有建边,就建边。
-
跳到 所在的点,更新 。
void join(char *s) {
int len=strlen(s);
int p=1;
for(int i=0;i<len;i++) {
int m=s[i];
if(!ch[p][m]) ch[p][m]=++num;
p=ch[p][m];
}
}
查找字符串 是否为某字符串前缀。
进行插入操作。
-
不存在建新边,就是前缀。
-
反之。
int find(char *s) {
int len=strlen(s);
int p=1;
for(int i=0;i<len;i++) {
int m=s[i];
if(!ch[p][m]) return false;
p=ch[p][m];
}
return true;
}