用一个map储存一个节点的所有子节点,插入时在最后一个节点标记这个节点为一个单词,查找时如果单词节点都存在且最后一个节点被标记为一个单词,表示该单词存在,根据前缀搜索时就无需判断标记,如果节点都存在且顺序对应就返回true
class Trie {
private class Node {
public Map<Character, Node> next = new HashMap<>();
public boolean isWord;
}
private Node root = new Node();
private int size = 0;
/** Initialize your data structure here. */
public Trie() {
}
/** Inserts a word into the trie. */
public void insert(String word) {
char[] s = word.toCharArray();
Node cur = root;
for (char c : s) {
if (cur.next.get(c) == null) {
cur.next.put(c, new Node());
}
cur = cur.next.get(c);
}
if (!cur.isWord) {
cur.isWord = true;
size++;
}
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
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;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
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;
}
}