又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 ——百度百科
插入字符串
abcd
ac
bac
bad
基本思路
字符串存储:
Trie树是从根节点开始(0号节点),依次查询字符串中的每个字符,若已经在树中存在,则查询下一个字符;若不存在则创建这个节点。当全部字符查询完成之后,在最后一个节点做一个标记表明这里存在一个字符串。
字符串查询
与查询类似,依次查询字符串中的每个字符,若不存在,则树中不存在此字符串;当查询到最后一个字符,如果不存在标记,则字符串不存在。
问题描述
维护一个字符串集合,支持两种操作:
“I x”向集合中插入一个字符串x;
“Q x”询问一个字符串在集合中出现了多少次。
共有N个操作,输入的字符串总长度不超过 105
,字符串仅包含小写英文字母。
输入格式
第一行包含整数N,表示操作数。
接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。
输出格式
对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。
每个结果占一行。
数据范围
代码实现
数据结构:大小为N*26的二维int数组s[][]存储字符串(26个字母);大小为N的int数组a[]存储每个节点对应的字符串个数;int变量idx表示节点下标
方法:
static void insert(String str){
char[]a = str.toCharArray();
int p = 0;
for (int i = 0; i < a.length; i++) {
int u = a[i]-'a';//将字符转换为数字
if(s[p][u]==0)s[p][u]=++idx;//不存在节点,创建节点
p = s[p][u];//接着往下走
}
cnt[p]++;
}
static int query(String str){
char[]a = str.toCharArray();
int p = 0;
for (int i = 0; i < a.length; i++) {
int u = a[i]-'a';
if(s[p][u]==0)return 0;
p = s[p][u];
}
return cnt[p];
}