思路如下:
这是一个Trie底层实现问题,有关Trie原理参照:
Trie树实现原理
class Trie {
Trie []next=new Trie[26];
boolean ieEndString=false;
/** Initialize your data structure here. */
public Trie() {
}
/** Inserts a word into the trie. */
public void insert(String word) {
char[]arr=word.toCharArray();
//先取根节点
Trie root=this;
for(int i=0;i<arr.length;i++){
//若根节点没有存储当前遍历字符,则新建一个该字符的Trie树
if(root.next[arr[i]-'a']==null){
root.next[arr[i]-'a']=new Trie();
}
//将root树移到当前结点的Trie树
root=root.next[arr[i]-'a'];
}
//插入完毕将当前最后一个结点Trie树设置为终止点,表示word插入完毕
root.ieEndString=true;
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
Trie root=this;
char[]arr=word.toCharArray();
for(int i=0;i<arr.length;i++){
//如果root中不存在当前遍历字符,则直接返回false,表示未查询到
if(root.next[arr[i]-'a']==null){
return false;
}
//接着将root树移到当前结点的Trie树
root=root.next[arr[i]-'a'];
}
//只有最后一个字符是终止字符,才算查询到该字符串,意思是所要查询的字符串不能比已有的字符串短
return root.ieEndString;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
Trie root=this;
char[]arr=prefix.toCharArray();
for(int i=0;i<arr.length;i++){
//如果未查询到,直接返回false
if(root.next[arr[i]-'a']==null){
return false;
}
//接着将root树移到当前结点的Trie树
root=root.next[arr[i]-'a'];
}
//说明prefix是某个已有字符串的前缀
return true;
}
}
/**
* Your Trie object will be instantiated and called as such:
* Trie obj = new Trie();
* obj.insert(word);
* boolean param_2 = obj.search(word);
* boolean param_3 = obj.startsWith(prefix);
*/