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.
- class TrieNode {
-
- public TrieNode() {}
- Map<Character,TrieNode> next = new HashMap<Character,TrieNode>();
- char c='\0';
- boolean isEnd = false;
- public TrieNode(char c) {
- this.c = c;
- }
- }
- public class WordDictionary {
- private TrieNode root;
-
- public WordDictionary() {
- root = new TrieNode();
- }
-
-
- public void addWord(String word) {
- Map<Character, TrieNode> children = root.next;
- for(int i=0; i<word.length(); i++) {
- char c = word.charAt(i);
- TrieNode t;
- if(children.containsKey(c)) {
- t = children.get(c);
- } else {
- t = new TrieNode(c);
- children.put(c, t);
- }
- children = t.next;
- if(i==word.length()-1) t.isEnd=true;
- }
- }
-
-
-
- public boolean search(String word) {
- return helper(word,root);
- }
-
- public boolean helper(String word,TrieNode tn){
- if(tn==null) return false;
- if(word.length() == 0 ) return tn.isEnd;
-
- Map<Character, TrieNode> children = tn.next;
- TrieNode t = null;
- char c = word.charAt(0);
- if(c=='.') {
- for(char key : children.keySet() ) {
- if(helper(word.substring(1), children.get(key) )) return true;
- }
- return false;
- } else if(!children.containsKey(c)) {
- return false;
- } else {
- t = children.get(c);
- return helper(word.substring(1), t);
- }
- }
- }
-
-
-
-
-
原文链接http://blog.csdn.net/crazy__chen/article/details/46576277