Description
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.
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.
Solution
设计一个储存数据结构,能够存储单词,并且满足正则表达式的查询单词是否存在的操作。
We implemented a trie tree to solve this problem. The trir node have 26 children and item for leaf node to store the word. In add, we find a path from work’s head to tail to store the characters into our trie tree. A global TrieNode root is needed. Leaf node have word value;
In search, we use a match helper to help determine whether a word or regular expression is in this tree. For match, when it comes to leaf node, determine the leaf node stores something or not(can not use eqaul because regular expression) Then for char is ‘.’, use a for loop to find a valid path, the child should be not null and match rest part of chars. If not ‘.’, just follow to the words order and call match.
Code
class WordDictionary {
public class TrieNode{
public TrieNode[] children = new TrieNode[26];
public String item = "";
}
private TrieNode root;
/** Initialize your data structure here. */
public WordDictionary() {
this.root = new TrieNode();
}
/** Adds a word into the data structure. */
public void addWord(String word) {
TrieNode node = this.root;
for (char c : word.toCharArray()){
if (node.children[c - 'a'] == null){
node.children[c - 'a'] = new TrieNode();
}
node = node.children[c - 'a'];
}
node.item = word;
}
/** 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(), 0, this.root);
}
private boolean match(char[] chars, int depth, TrieNode node){
if (depth == chars.length){
return !node.item.equals("");
}
if (chars[depth] == '.'){
for (int i = 0; i < node.children.length; i++){
if (node.children[i] != null && match(chars, depth + 1, node.children[i])){
return true;
}
}
}
else{
return node.children[chars[depth] - 'a'] != null && match(chars, depth + 1, node.children[chars[depth] - 'a']);
}
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);
*/
Time Complexity: O(n)
Space Complexity: O(n)