用TRIE树解决。查找时需要递归查找,条件带上当前节点,如果当前节点是 . 就对所有子节点递归查找,有一个递归查找成功就返回成功。
class WordDictionary {
Trie trie;
public WordDictionary() {
trie = new Trie();
}
public void addWord(String word) {
trie.insert(word);
}
public boolean search(String word) {
return trie.find(word);
}
}
class TrieNode {
Map<Character, TrieNode> children;
boolean isEnded;
public TrieNode() {
children = new HashMap<>();
}
}
class Trie {
TrieNode root;
int size;
public Trie() {
root = new TrieNode();
size = 0;
}
public void insert(String word) {
TrieNode cur = root;
for (int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if (cur.children.get(c) == null) {
cur.children.put(c, new TrieNode());
}
cur = cur.children.get(c);
}
if (!cur.isEnded) {
cur.isEnded = true;
size++;
}
}
private boolean find(int index, String word, TrieNode cur) {
for (int i = index; i < word.length(); i++) {
char c = word.charAt(i);
if (c != '.') {
if (cur.children.get(c) == null) {
return false;
}
cur = cur.children.get(c);
} else {
if (cur.children.size() == 0) {
return false;
}
boolean res = false;
for (Character key : cur.children.keySet()) {
res = res | find(i + 1, word, cur.children.get(key));
}
return res;
}
}
return cur.isEnded;
}
public boolean find(String word) {
return find(0, word, root);
}
}