字典树模板
程序员文章站
2022-06-04 12:44:04
...
字典树核心思想是利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
通过图上大家可以看出它可以迅速的查询单词的覆盖问题,寻找前缀。直接上代码
题意就是给你一堆字符串,到空格结束,然后给再给你一堆串,求每给你一个串,在第一堆串中有多少以此为前缀。
所以核心分为两部分,第一部分是建树,第二部分是查找。
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <cstdio>
using namespace std;
char s[25];
string ss;
struct tree{
int t; //这个很灵活,依题而定,在这里可以用来表示经过这个结点的单词的个数
tree *next[30]; //记录结点下的字符,有二十六个英文字母。
tree()
{
t = 0;
memset(next, NULL, sizeof(next));
}
};
tree *root;
void Insert() //建树
{
tree *f = root;
int k;
int len = strlen(s);
for(int i = 0; i < len; i++)
{
k = s[i] - 'a';
if(f -> next[k] == NULL)
{
f -> next[k] = new tree;
}
f = f -> next[k];
f -> t += 1;
}
}
int Search() //查找
{
int len = ss.length();
int k;
tree *f = root;
for(int i = 0; i < len; i++)
{
k = ss[i] - 'a';
if(f -> next[k] == NULL)
return 0;
f = f -> next[k];
}
return f -> t;
}
int main()
{
root = new tree;
while(1)
{
int t = 0;
do{
scanf("%c", &s[t]);
}while(s[t++] != '\n');
if(s[0] == '\n')
break;
s[t - 1] = '\0';
Insert();
}
while(cin >> ss)
{
int ans = Search();
cout << ans << endl;
}
return 0;
}
上一篇: Python初学者在GitHub应该从哪里开始学习?
下一篇: 字典树(前缀树)