java
复制代码
class WordDictionary {
Trie[] root;
public WordDictionary() {
root = new Trie[26];
}
public void addWord(String word) {
Trie[] trie = root;
for (int i = 0; i < word.length(); i++) {
int idx = word.charAt(i) - 'a';
if (trie[idx] == null) {
trie[idx] = new Trie();
}
if (i == word.length() - 1) {
trie[idx].isLast = true;
}
trie = trie[idx].child;
}
}
public boolean search(String word) {
return dfs(root, word, 0);
}
public boolean dfs(Trie[] trie, String word, int loc) {
char c = word.charAt(loc);
if (c != '.') {
int idx = c - 'a';
// 字典树中无该字符
if (trie[idx] == null) {
return false;
}
// 判断字典树中该字符是否作为单词末尾
if (loc == word.length() - 1) {
return trie[idx].isLast;
}
return dfs(trie[idx].child, word, loc + 1);
}
// '.'可以代表任何字符
for (int i = 0; i < 26; i++) {
// 字典树中无该字符
if (trie[i] == null) {
continue;
}
boolean b = false;
if (loc == word.length() - 1) {
// 判断字典树中该字符是否作为单词末尾
b = trie[i].isLast;
} else {
// 继续深搜寻找单词后面的字符
b = dfs(trie[i].child, word, loc + 1);
}
// 满足一种情况就成功
if (b) {
return true;
}
}
return false;
}
}
class Trie {
boolean isLast;
Trie[] child;
public Trie() {
isLast = false;
child = new Trie[26];
}
}
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary obj = new WordDictionary();
* obj.addWord(word);
* boolean param_2 = obj.search(word);
*/