题目:
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
.
分析:
class TrieNode{
//使用字典序进行数据的存储
boolean isLeaf;
Map<Character,TrieNode> content;
public TrieNode(){
content=new HashMap<Character,TrieNode>();
}
}
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) {
if(word==null||word.length()==0){
return ;
}
TrieNode node=root;
TrieNode tempNode=null;
for(int i=0;i<word.length();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(word,0,root);
}
//使用递归实现
public boolean search(String word,int index,TrieNode root){
if(word==null||word.length()==0){
return false;
}
TrieNode node=root;
TrieNode tempNode=null;
for(int i=index;i<word.length();i++){
Character c=word.charAt(i);
if(c=='.'){
//需要递归部分
Map<Character,TrieNode> hm=node.content;
Set<Character> keys=hm.keySet();
boolean flag=false;
for(Character cc:keys){
TrieNode curNode=hm.get(cc);
if((i==(word.length()-1))&&curNode.isLeaf){
//已经到了末尾,匹配成功
return true;
}
if(i>=word.length()){
//已经到末尾了,还未匹配成功
return false;
}
flag=flag||search(word,i+1,curNode);
}
return flag;
}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 obj = new WordDictionary();
* obj.addWord(word);
* boolean param_2 = obj.search(word);
*/