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.
版本1,用MAP实现:
class WordDictionary {
public:
class CharNode {
public:
CharNode(): isLeaf(false) {};
map<char, CharNode *> chars;
bool isLeaf;
};
CharNode root;
// Adds a word into the data structure.
void addWord(string word) {
int i;
CharNode *ptr = NULL;
ptr = &root;
for (i = 0; i < word.length(); ++i) {
if ((ptr->chars).find(word[i]) == (ptr->chars).end()) {
CharNode *newNode = new CharNode();
(ptr->chars)[word[i]] = newNode;
ptr = newNode;
} else {
ptr = (ptr->chars)[word[i]];
}
}
ptr->isLeaf = true;
}
bool _search(CharNode *r, string word) {
int i;
CharNode *ptr = r;
for (i = 0; i < word.length(); ++i) {
if (word[i] == '.') {
for (map<char, CharNode *>::iterator it = (ptr->chars).begin(); it != (ptr->chars).end(); ++it) {
if (_search(it->second, word.substr(i+1, word.length()-i-1)) == true) {
return true;
} else {
continue;
}
}
// not found
return false;
}
if ((ptr->chars).find(word[i]) == (ptr->chars).end()) {
return false;
} else {
ptr = (ptr->chars)[word[i]];
}
}
return ptr->isLeaf;
}
// Returns if the word is in the data structure. A word could
// contain the dot character '.' to represent any one letter.
bool search(string word) {
return _search(&root, word);
}
};
// Your WordDictionary object will be instantiated and called as such:
// WordDictionary wordDictionary;
// wordDictionary.addWord("word");
// wordDictionary.search("pattern");
版本2,用数组查表:
class WordDictionary {
public:
class CharNode {
public:
CharNode(): isLeaf(false) {memset(chars, 0, sizeof(chars));}
CharNode *chars[26];
bool isLeaf;
};
CharNode root;
// Adds a word into the data structure.
void addWord(string word) {
int i;
CharNode *ptr = NULL;
ptr = &root;
for (i = 0; i < word.length(); ++i) {
if (ptr->chars[word[i]-'a'] == NULL) {
CharNode *newNode = new CharNode();
(ptr->chars)[word[i]-'a'] = newNode;
ptr = newNode;
} else {
ptr = (ptr->chars)[word[i]-'a'];
}
}
ptr->isLeaf = true;
}
bool _search(CharNode *r, string word) {
int i;
CharNode *ptr = r;
if (ptr == NULL) return false;
for (i = 0; i < word.length(); ++i) {
if (word[i] == '.') {
for (int j = 0; j < 26; ++j) {
if (_search(ptr->chars[j], word.substr(i+1, word.length()-i-1)) == true) {
return true;
} else {
continue;
}
}
// not found
return false;
}
if ((ptr->chars)[word[i]-'a'] == NULL) {
return false;
} else {
ptr = (ptr->chars)[word[i]-'a'];
}
}
return ptr->isLeaf;
}
// Returns if the word is in the data structure. A word could
// contain the dot character '.' to represent any one letter.
bool search(string word) {
return _search(&root, word);
}
};
// Your WordDictionary object will be instantiated and called as such:
// WordDictionary wordDictionary;
// wordDictionary.addWord("word");
// wordDictionary.search("pattern");