力扣 208 实现前缀树
1.前缀树的每个结点有26个子节点,分别装a,b,c,d,e,f........
具体实现的时候是1个结点里面有一个长度为26个字母的数组,kids[0]==null表示子节点中不含有‘a’这个字符
2.search方法和startwith方法的区别:
先往前缀树中插入单词apple
然后search("apple") 返回的是true 也就是说apple是曾经插入的单词
但是如果:
search("app"),返回的就是false
startwith("app") 返回的就是true
也就是说search方法判断的是是否曾经插入过的一个单词,也就是说这个词的最后一个字符是叶子节点
startwith是不用是曾经插入过的单词,只要包含就可以,这个词最后一个字符不用是叶子节点,最后一个字符可以是非叶子结点
class Trie
{
class Node
{
Node[] kids=new Node[26];
boolean flag;//标志从根节点到这个结点是不是曾经插入过的一个单词
}
Node root=new Node();
public Trie()
{
}
//往前缀树中插入字符
public void insert(String word)
{
int n=word.length();
Node cur=root;//从前缀树的根节点出发
for(int i=0;i<word.length();i++)
{
char temp=word.charAt(i);
int index=temp-'a';
if(cur.kids[index]==null)
{
cur.kids[index]=new Node();
}
cur=cur.kids[index];
}
cur.flag=true;
}
//检查前缀树中是否包含某个单词(是否曾经插入过这个单词)
public boolean search(String word)
{
Node cur=root;//从前缀树的根节点出发
for(int i=0;i<word.length();i++)
{
char temp=word.charAt(i);
int index=temp-'a';
if(cur.kids[index]==null)
{
return false;
}
cur=cur.kids[index];
}
return cur.flag;
}
public boolean startsWith(String prefix)
{
Node cur=root;//从前缀树的根节点出发
for(int i=0;i<prefix.length();i++)
{
char temp=prefix.charAt(i);
int index=temp-'a';
if(cur.kids[index]==null)
{
return false;
}
cur=cur.kids[index];
}
return true;
}
}