Trie 树
Trie树又称字典树、单词查找树。是一种能够高效存储和查找字符串集合的数据结构。
插入字符串
对上面已知的tire树,假如插入一个字符串"abdf",需要进行以下操作:
从字符a开始寻找:
从第一层开始p =0 ,s[p][a]是否存在,若不存在,则创建s[p][a]=++idx; 若存在,不做操作,记p = s[p][a];
找寻字符b:
查看s[p][b]是否存在,若不存在,创建s[p][b]= ++idx,若不存在,不做操作,p = s[p][a]
同样方法找寻字符’d’,‘f’
查找完成后,把该字符串出现次数加一
void Insert(string str){
int p =0;
for(int i=0; str[i]!='\0';i++){
int u = str[i] - 'a';
if(!s[p][u]){
s[p][u] = ++idx;
}
p = s[p][u];
}
cnt[p] ++;
}
查找字符串出现次数
从第一个字符开始,如果没找到,直接返回0;一直找到最后一个字符,返回最后一个字符的下一个位置p,返回cnt[p]即为字符串的个数
int find(string str){
int p = 0;
for(int i =0 ; str[i]!='\0';i++){
int u = str[i]-'a';
if(!s[p][u]){
return 0;
}
else{
p = s[p][u];
}
}
return cnt[p];
}
完整代码
对应acwing 835题
# include <iostream>
# include <cstring>
using namespace std;
const int n = 100010;
int s[n][26];
int cnt[n];
int idx;
string str;
void Insert(string str){
int p =0;
for(int i=0; str[i]!='\0';i++){
int u = str[i] - 'a';
if(!s[p][u]){
s[p][u] = ++idx;
}
p = s[p][u];
}
cnt[p] ++;
}
int find(string str){
int p = 0;
for(int i =0 ; str[i]!='\0';i++){
int u = str[i]-'a';
if(!s[p][u]){
return 0;
}
else{
p = s[p][u];
}
}
return cnt[p];
}
int main(){
int m;
int i=0;
cin>>m;
while(m--){
char op;
cin>>op>>str;
if(op == 'I'){Insert(str);}
else{
cout<<find(str)<<endl;
}
}
}