# 211. Add and Search Word - Data structure design

### 题目211. Add and Search Word - Data structure design

Design a data structure that supports the following two operations:
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:
search("b..") -> true
Note:
You may assume that all words are consist of lowercase letters a-z.

``````public class WordDictionary {
static class TrieNode{
boolean isLeaf;
Map<Character,TrieNode> content;
TrieNode(){
content = new HashMap<Character,TrieNode>();
}
}

private TrieNode root;

public WordDictionary() {
root = new TrieNode();
}

// Adds a word into the data structure.
if(word == null || word.length() == 0){
return;
}

TrieNode node = root;
TrieNode tempNode = null;;
for(int i=0, len=word.length(); i<len; i++){
Character c = word.charAt(i);
tempNode = node.content.get(c);
if(tempNode == null){
tempNode = new TrieNode();
node.content.put(c,tempNode);
}
node = tempNode;
}
node.isLeaf = 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 search(0,word,root);
}

private boolean search(int idx, String word, TrieNode root){
if(word == null || word.length() == 0){
return false;
}

TrieNode node = root;
TrieNode tempNode = null;
for(int i=idx, len=word.length(); i<len; i++){
Character c = word.charAt(i);
if('.' == c){
Map<Character,TrieNode> map = node.content;
Set<Character> keys = map.keySet();
boolean result = false;
for(Character ch : keys){
TrieNode trieNode = map.get(ch);
if((i == (len-1)) && trieNode.isLeaf){
return true;
}

if(i >= len){
return false;
}
result = result || search(i+1,word,map.get(ch));
}
return result;
}else{
tempNode = node.content.get(c);
if(tempNode == null){
return false;
}
node = tempNode;
}
}
return node.isLeaf;
}
}

// Your WordDictionary object will be instantiated and called as such:
// WordDictionary wordDictionary = new WordDictionary();