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
.
Solution:
public class WordDictionary { public class TrieNode{ TrieNode[] childs; boolean hasWord; public TrieNode(){ childs = new TrieNode[26]; hasWord = false; } } TrieNode root; public WordDictionary(){ root = new TrieNode(); } // Adds a word into the data structure. public void addWord(String word) { TrieNode cur = root; for (char c : word.toCharArray()){ if (cur.childs[c-'a']==null){ cur.childs[c-'a'] = new TrieNode(); } cur = cur.childs[c-'a']; } cur.hasWord = 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 searchRecur(root,word,0); } public boolean searchRecur(TrieNode curNode, String word, int start){ if (curNode==null){ return false; } if (start>=word.length()){ return curNode.hasWord; } char c = word.charAt(start); if (c=='.'){ for (TrieNode child : curNode.childs) if (searchRecur(child,word,start+1)){ return true; } return false; } else { return searchRecur(curNode.childs[c-'a'],word,start+1); } } } // Your WordDictionary object will be instantiated and called as such: // WordDictionary wordDictionary = new WordDictionary(); // wordDictionary.addWord("word"); // wordDictionary.search("pattern");