学习请点这里
主要作用:
- 词频统计:例如,给定一个由 10 万个单词组成的库,现要你判断一个单词是否有在库中出现,若出现,求出共出现多少次。
- 前缀匹配:给定字符串,找出以这个字符串开头的所有单词。
插入代码
const int maxn = 1e5;
int Tire[maxn][27];
int book[maxn];
int tot = 1;
void init(){
memset(Trie, 0, sizeof(Trie));
memset(book, 0, sizeof(book));
tot = 1;
}
void Insert (char *s) { //s是要插入的字符串
int len = strlen(s);
int u = 1;
for(int i = 0; i < len; ++i) {
int c = s[i] - 'a';
if(Tire[u][c] == 0){
Tire[u][c] = tot++;
}
u = Tire[u][c];
}
book[u] = true; //单词的结束点
}
寻找前缀
bool FindPre(char *s) { //s是要查找的字符串
int len = strlen(s);
int u = 1;
for(int i = 0; i < len; ++i) {// 遍历字典树
int c = s[i] - 'a';
if( !Tire[u][c]) {
return false;
}
u = Tire[u][c];
}
return true; //扫完该单词, (假设单词本身也是自己的前缀)
}
找是否出现单词
bool FindWorld(char *s) { //s是要查找的字符串
int len = strlen(s);
int u = 1; //根节点
for(int i = 0; i < len; ++i){// 遍历字典树
int c = s[i] - 'a';
if( !Tire[u][c]){
return false;
}
u = Tire[u][c];
}
if(book[u]) //此字母是单词的结束点
return true;
else
return false;
}