实现一个 Trie,包含 insert
, search
, 和 startsWith
这三个方法。
样例
样例 1:
输入:
insert("lintcode")
search("lint")
startsWith("lint")
输出:
false
true
样例 2:
输入:
insert("lintcode")
search("code")
startsWith("lint")
startsWith("linterror")
insert("linterror")
search("lintcode)
startsWith("linterror")
输出:
false
true
false
true
true
注意事项
你可以认为所有的输入都是小写字母a-z。
解题思路:
标准Trie
public class Trie {
private class Node{
public boolean isWord; //说明以当前节点为尾的字符串能否组成一个单词
public Map<Character, Node> next; //next用map存储连接当前节点的下一个节点的值的集合
public Node(boolean isWord){
this.isWord = isWord;
this.next = new HashMap<>();
}
public Node(){
this(false);
}
}
private Node root;
public Trie() {
// do intialization if necessary
root = new Node();
}
/*
* @param word: a word
* @return: nothing
*/
public void insert(String word) {
// write your code here
Node cur = root;
for(int i=0; i<word.length(); i++){
char c = word.charAt(i);
if(cur.next.get(c) == null)
cur.next.put(c, new Node());
cur = cur.next.get(c);
}
cur.isWord = true;
}
/*
* @param word: A string
* @return: if the word is in the trie.
*/
public boolean search(String word) {
// write your code here
Node cur = root;
for(int i=0; i<word.length(); i++){
char c = word.charAt(i);
if(cur.next.get(c) == null)
return false;
cur = cur.next.get(c);
}
return cur.isWord;
}
/*
* @param prefix: A string
* @return: if there is any word in the trie that starts with the given prefix.
*/
public boolean startsWith(String prefix) {
// write your code here
Node cur = root;
for(int i=0; i<prefix.length(); i++){
char c = prefix.charAt(i);
if(cur.next.get(c) == null)
return false;
cur = cur.next.get(c);
}
return true;
}
}