- 单模式串匹配
BF 算法和 RK 算法
BM 算法和 KMP 算法 - 多模式串匹配算法
Trie 树和 AC 自动机
一、 什么是“Trie树”?
1. 他是一种树形结构,是一种专门处理字符串匹配的数据结构,解决在一组字符串集合中快速查找某个字符串的问题。
2. Trie树的本质是利用字符串之间公共前缀,将重复的前缀合并在一起
Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。
how,hi,her,hello,so,see
其中,根节点不包含任何信息,每个节点表示一个字符串中的字符,从根节点到红色节点的一条路径表示一个字符串(红色节点并不都是叶子节点)。
3. 查找
当在Trie树中查找一个字符串时,如“her”,就将要查找的字符串分割成单个的字符h,e,r,然后从Trie树的根节点开始匹配。但,假若要查找的字符串是“he”,用上面同样的方法,从根节点开始,沿着某条路径来匹配,发现路径的最后一个节点“e”不是红色的,即“he”是某个字符串的前缀,但不能完全匹配任何字符串。
二 、如何实现一课Trie树?
1,Trie树主要有两个操作,一个是将字符串集合构造成Trie树。这个程可分解为:
- 将一个字符串插入到Trie树的过程
- 在Trie树中查询一个字符串
2,如何存储一个Trie树
①:Trie树是一个多叉树,需要存储一个节点的所有子节点的指针。
②:一种经典的存储方式:借助散列表额思想,通过一个下标与字符一一映射的数组,来存储子节点的指针。
class TrieNode {
char data;
TrieNode children[26];
}
借助散列表的思想,我们通过一个下标与字符一一映射的数组,来存储子节点的指针。
假设字符串中只有从a到z这26个小写字母,从数组中下标为0的位置,存储指向子节点a的指针,下标为1的位置存储指向子节点b的指针,以此类推,下标为25的位置,储存的是指向的子节点z的指针。如果某个字符的子节点不存在,就在对应的下标的位置存储null。
当在Trie树中查找字符串的时候,就可以通过字符的ASCII码减去“a”的ASCII码,迅速找到匹配的子节点的指针。
public class