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.
click to show hint.
You should be familiar with how a Trie works. If not, please work on this problem: Implement Trie (Prefix Tree) first.
设计一个数据结构,满足插入和查找的功能,查找要满足”.”代表任意字母的要求
其实就是Trie的变形
public class WordDictionary {
Trie trie = new Trie();
// Adds a word into the data structure.
public void addWord(String word) {
trie.addWord(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 trie.search(word);
}
class TrieNode{
boolean isEnd;
TrieNode[] childs;
public TrieNode(boolean isEnd){
this.isEnd = isEnd;
this.childs = new TrieNode[26];
}
}
class Trie {
TrieNode root;
public Trie(){
this.root = new TrieNode(true);
}
public void addWord(String word){
TrieNode node = root;
for(int i = 0 ; i < word.length(); ++i){
int index = word.charAt(i) - 'a';
if(node.childs[index] == null){
node.childs[index] = new TrieNode(false);
}
node = node.childs[index];
}
node.isEnd = true;
}
public boolean search(String word){
return search(word, 0, root);
}
public boolean search(String word, int index, TrieNode node){
if(word.length() == index) return node.isEnd;
if(word.charAt(index) == '.'){
for(int i = 0; i < 26; ++i){
if(node.childs[i] == null) continue;
boolean flag = search(word, index + 1, node.childs[i]);
if(flag == true)return true;
}
return false;
}
int i = word.charAt(index) - 'a';
node = node.childs[i];
return node != null && search(word, index + 1, node);
}
}
}