Design a data structure that supports the following two operations:
void addWord(word) bool search(word)
search(word) can search a literal word or a regular expression string containing only letters a-z
or .
. A .
means it can represent any one letter.
For example:
addWord("bad") addWord("dad") addWord("mad") search("pad") -> false search("bad") -> true search(".ad") -> true search("b..") -> true
Note:
You may assume that all words are consist of lowercase letters a-z
.
You should be familiar with how a Trie works. If not, please work on this problem:
Implement Trie (Prefix Tree) first.
首先借鉴
208. Implement Trie (Prefix Tree)的方法构建单词查找树,然后修改match函数,使之变成dfs方法,一直向下查找。遇到‘.’,遍历26个child,否则正常遍历。代码如下:
class TrieNode {
boolean isEnd;
TrieNode[] child;
public TrieNode() {
isEnd = true;
child = new TrieNode[26];
}
}
public class WordDictionary {
private TrieNode root;
/** Initialize your data structure here. */
public WordDictionary() {
root = new TrieNode();
}
/** Adds a word into the data structure. */
public void addWord(String word) {
TrieNode currentNode = root;
for (char ch: word.toCharArray()) {
int id = ch - 'a';
if (currentNode.child[id] == null) {
currentNode.child[id] = new TrieNode();
currentNode.child[id].isEnd = false;
}
currentNode = currentNode.child[id];
}
currentNode.isEnd = true;
}
/** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
public boolean search(String word) {
return match(word.toCharArray(), root, 0);
}
private boolean match(char[] chs, TrieNode currNode, int k) {
if (k == chs.length) {
return currNode.isEnd;
}
int id = chs[k] - 'a';
if (chs[k] != '.') {
if (currNode.child[id] == null) {
return false;
}
return match(chs, currNode.child[id], k + 1);
} else {
for (int i = 0; i < 26; i ++) {
if (currNode.child[i] != null) {
if (match(chs, currNode.child[i], k + 1)) {
return true;
}
}
}
}
return false;
}
}
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary obj = new WordDictionary();
* obj.addWord(word);
* boolean param_2 = obj.search(word);
*/