Add and Search Word - Data structure design
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
.
You should be familiar with how a Trie works. If not, please work on this problem: Implement Trie (Prefix Tree) first.
题意:设计数据结构支持 addWord 与 search操作。search(word)逐字符查找或按正则表达式查找,.代表一个字符。
解题思路 : 创建Trie树
public class WordDictionary {
private TrieNode root;
public WordDictionary() {
root = new TrieNode();
}
// Adds a word into the data structure.
public void addWord(String word) {
TrieNode tmpRoot = root;
for(int i = 0; i < word.length(); i++){
char c = word.charAt(i);
if(tmpRoot.next[c - 'a'] == null){
tmpRoot.next[c - 'a'] = new TrieNode(c);
}
tmpRoot = tmpRoot.next[c - 'a'];
}
tmpRoot.isWordEnd = 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) {
int idx = 0;
TrieNode tmpRoot = root;
return search(word, idx, tmpRoot);
}
public boolean search(String word, int idx, TrieNode tmpRoot){
if(tmpRoot == null) return false;
if(idx == word.length() && tmpRoot.isWordEnd) return true;
if(idx >= word.length()) return false;
char c = word.charAt(idx);
if(c == '.'){
boolean result = false;
for(int i = 0; i < 26; i++){
if(null != tmpRoot.next[i]){
result = search(word, idx + 1, tmpRoot.next[i]);
if(result) return result;
}
}
return result;
}else{
return search(word, idx + 1, tmpRoot.next[c - 'a']);
}
}
}
class TrieNode {
// Initialize your data structure here.
public TrieNode() { //默认根结点
value = '\0';
next = new TrieNode[26];
isWordEnd = false;
}
public TrieNode(char c){
value = c;
next = new TrieNode[26];
isWordEnd = false;
}
public TrieNode(char c, boolean endFlg){
value = c;
next = new TrieNode[26];
isWordEnd = endFlg;
}
public TrieNode[] next;
public char value;
public boolean isWordEnd; //该字符是一个结尾字符
}
// Your WordDictionary object will be instantiated and called as such:
// WordDictionary wordDictionary = new WordDictionary();
// wordDictionary.addWord("word");
// wordDictionary.search("pattern");