1.前缀树的概念:前缀树又叫字典树或单词查找树(高效的存储和查找字符串集合的数据结构)。
2.主要应用场景:给定一个字符串集合构建一颗前缀树,然后给定一个字符串,判断前缀树中是否包含该字符串或者该字符串的前缀。
3.存储形式:存储的字符串可能:全是 小写字母 或全是 大写字母 或全是 数字 或全是 0和1
4.字典树的核心思想是:利用字符串之间的公共前缀来节省存储空间和提高查询效率。它是一棵多叉树,每个节点代表一个字符串的前缀,从根节点到叶子节点的路径组成一个字符串。字典树的根节点不包含字符,每个子节点代表一个字符,从根节点到任意一个节点所经过的路径上的字符连接起来即为该节点所代表的字符串。每个节点可以存储一个或多个字符串,通常使用一个标志来标记一个节点代表的字符串是否存在。当需要在一组字符串中查找某个字符串时,可以利用字典树来实现高效的查找操作。
private static final int[][] son=new int[100000][26];//26个字母,一共100000个数据
private static final int[] count=new int[100000];//存储以当前这个点结尾的单词有多少个
private int index=0;//下标为0的点,既是根节点,又是空节点
public void insert(char[] str){
int parent=0;
for(int i=0;i
private static final int[][] son=new int[100000][26];//26个字母,一共100000个数据
private static final int[] count=new int[100000];//存储以当前这个点结尾的单词有多少个
private int index=0;//下标为0的点,既是根节点,又是空节点
public int query(char[] str){
int parent=0;
for(int i=0;i
import java.util.Scanner;
class Trie {
private int[][] son=new int[100010][26];//26个字母,一共100000个数据
private int[] count=new int[100010];//存储以当前这个点结尾的单词有多少个
private int index=0;
public Trie() {
}
public void insert(String word) {
char[] str=word.toCharArray();
//parent表示行
int parent=0;
for(int i=0;i
public void insert(String word) {
Trie trie = this;//获得根结点
for (char c : word.toCharArray()) {
if (trie.next.get(c) == null) {//当前结点不存在
trie.next.put(c, new Trie());//创建当前结点
}
trie = trie.next.get(c);//得到字符c的结点,继续向下遍历
}
trie.isEnd = true;
}
public boolean search(String word) {
Trie trie = this;//获得根结点
for (char c : word.toCharArray()) {
if (trie.next.get(c) == null) {//当前结点不存在
return false;
}
trie = trie.next.get(c);//得到字符c的结点,继续向下遍历
}
return trie.isEnd;
}
public boolean startsWith(String prefix) {
Trie trie = this;//获得根结点
for (char c : prefix.toCharArray()) {
if (trie.next.get(c) == null) {//当前结点不存在
return false;
}
trie = trie.next.get(c);//得到字符c的结点,继续向下遍历
}
return true;
}
public class Trie {
Map next;
boolean isEnd;
public Trie() {
this.next = new HashMap<>();
this.isEnd = false;
}
public void insert(String word) {
Trie trie = this;//获得根结点
for (char c : word.toCharArray()) {
if (trie.next.get(c) == null) {//当前结点不存在
trie.next.put(c, new Trie());//创建当前结点
}
trie = trie.next.get(c);//得到字符c的结点,继续向下遍历
}
trie.isEnd = true;
}
public boolean search(String word) {
Trie trie = this;//获得根结点
for (char c : word.toCharArray()) {
if (trie.next.get(c) == null) {//当前结点不存在
return false;
}
trie = trie.next.get(c);//得到字符c的结点,继续向下遍历
}
return trie.isEnd;
}
public boolean startsWith(String prefix) {
Trie trie = this;//获得根结点
for (char c : prefix.toCharArray()) {
if (trie.next.get(c) == null) {//当前结点不存在
return false;
}
trie = trie.next.get(c);//得到字符c的结点,继续向下遍历
}
return true;
}
}