java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846
文章目录
就是一种数据结构,一般自动补完,拼写检查都可以用这种数据结构。 比如题目要求的这棵前缀树,只保存单词。 那么我们每个结点就可以保存26个字母,也就是26叉树,每个结点都有26个子结点,每个结点都有26种可能,这些结点最终可以组成所有单词。 说白了就是通过穷举法,设定前缀。比如第一个字母可以是a-z任意一个, 第二个字母也可以是a-z.第一个就算只选择一个c,第二个选择a-z任意一个,都有26种可能。也就是说,就算只有2层结点就有26*26种不同的组成 如何知道当前前缀是否是一个完整单词呢?
可以在结点对象增加一个标志位isEnd,例如apple,那么它们每个字母的标志位为[F,F,F,F,T],也就是完全匹配apple,才能访问到这个前缀的最后一个字母e,才可以获得它的isEnd = true。例如只匹配到appl,此时最后一个匹配的字符是l。因为apple才是完整的单词,l标志位是false,就说明不是完整单词
class Trie {
private final int R = 26 ;
private Trie [ ] children;
private boolean isEnd;
public Trie ( ) {
children= new Trie [ R ] ;
isEnd = false ;
}
public void insert ( String word) {
Trie tmp = this ;
for ( char i : word. toCharArray ( ) ) {
if ( tmp. children[ i - 'a' ] == null ) {
tmp. children[ i - 'a' ] = new Trie ( ) ;
}
tmp = tmp. children[ i - 'a' ] ;
}
tmp. isEnd = true ;
}
public boolean search ( String word) {
Trie tmp = this ;
for ( char i : word. toCharArray ( ) ) {
if ( tmp. children[ i - 'a' ] == null ) {
return false ;
}
tmp = tmp. children[ i - 'a' ] ;
}
return tmp. isEnd;
}
public boolean startsWith ( String prefix) {
Trie tmp = this ;
for ( char i : prefix. toCharArray ( ) ) {
if ( tmp. children[ i - 'a' ] == null ) {
return false ;
}
tmp = tmp. children[ i - 'a' ] ;
}
return true ;
}
}