基本概念
高效存储和查找字符串集合的数据结构。
依次插入 "cat" ,"car", "busy".
通常在实现的时候,会在节点结构中设置一个标志,用来标记该结点处是否构成一个单词(关键字)
代码实现模板
const int N = 1e6+10;
//0 既是根节点 又是空节点
int son[N][26]; // 如son[p][j] 存储从节点 p 沿着j这条边 走到的子节点 。 边为26个小写字母(a~z) 对应的映射值 0~25
int cnt[N]; // 如cnt[p] 存储以节点p结尾的单词的插入次数
int idx;
//插入一个字符串
void insert(char* str){
int p = 0; //从根节点开始
for(int i = 0 ; str[i]; i++){ //遍历该字符串中的每个字符 str[i]字符串以 \0 结尾
int u = str[i] - 'a'; //将26个字母 映射成0~25
if(!son[p][u]) son[p][u] = ++idx; //若字典树中没有 该字母 将该字母插入
p = son[p][u]; //令下一个字母 从上一个字母结束位置开始
}
cnt[p]++; //以p结尾的单词 加1
}
//查询字符串出现次数
int query(char*str){
int p = 0;
for(int i = 0; str[i]; i++){
int u = str[i] - 'a';
if(!son[p][u]) return 0; //若没找到 返回0
p = son[p][u];
}
return cnt[p]; //找到返回出现次数
}