Tire树是一种利用前缀用来高效的存储和查询字符串的数据结构
适用条件
需要存储大量字符串,字符串中包含的字符种类较少,并且前缀类似。
要点
每个字符串结尾要打标记,root为空节点。
模板(数组实现)
final static int N = 100010;
String str;
int[][] son= new int[N][26];
int[] cnt = new int[N];
int idx = 0;
//son表示编号为N的节点的子节点们的编号
//cnt表示以编号为N的节点结尾的字符串在集合中出现的个数
//(注意以编号为N的节点结尾的字符串的遍历路径唯一)
//idx表示当前正在操作的节点编号
public void insert(String str)//也可传
{
int p = 0;//0既为头结点,又为空节点(类似线索二叉树)
for (int i = 0; i < str.length(); i ++ )
{
int u = str[i] - 'a';//获取字符映射后的编号0~25
if (!son[p][u]) son[p][u] = ++ idx;
//表示p下面连接了一个u(映射后)的子节点,编号为idx
p = son[p][u];//向下移动,重新将子节点作为根节点
}
cnt[p] ++ ;//以编号p为尾节点的字符串只有一个
}
public int query(String str)
{
int p = 0;
for (int i = 0; i < str.length(); i ++ )
{
int u = str[i] - 'a';
if (!son[p][u]) return 0;//没找到该字符串,返回0
p = son[p][u];
}
//循环结束后,说明存在以编号p为尾节点的字符串
return cnt[p];
}