您的位置:首页 > 其它

[leetcode] 211.Add and Search Word - Data structure design

2015-07-27 23:24 447 查看
[题目:

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

题意:

设置数据结构,可以存放字符串,可以查询某个字符串是否存储过。并且支持通配符,’.’可以代表任意一个字符。

思路:

这道题仍旧使用trie树来存放节点。只是在搜索时由于通配符可以适配任一个字符,所以需要采用回溯的方法。匹配到当前字符时,如果遇到’.’,那么就找任一个子孩子,尝试继续寻找下去。

以上。

代码如下:

struct TrieNode {
char c;
bool leaf;
TrieNode* children[26];
TrieNode(char cc):c(cc),leaf(false) {
memset(children, 0, sizeof(children));
}
TrieNode():leaf(false) {
memset(children, 0, sizeof(children));
}
};
class WordDictionary {
public:
WordDictionary() {
root = new TrieNode();
}
// Adds a word into the data structure.
void addWord(string word) {
if(word.empty())return;
TrieNode* tmp = root;
for(auto i : word) {
if(tmp->children[i - 'a'] == NULL) {
TrieNode * node = new TrieNode(i);
tmp->children[i - 'a'] = node;
}
tmp = tmp->children[i - 'a'];
}
tmp->leaf = true;
}

// 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) {
if(word.size() == 0)return false;
search(word, 0, root);
}
bool search(string& word, int index, TrieNode* node) {
if(index == word.size())return node->leaf;
if(word[index] != '.') {
TrieNode* tmp = node->children[word[index] - 'a'];
if(tmp == NULL)return false;
else return search(word, index + 1, tmp);
}
else {
for(int i = 0; i < 26; i++) {
TrieNode* tmp = node->children[i];
if(tmp != NULL) {
if(search(word, index + 1, tmp))return true;
}
}
return false;
}
}
private:
TrieNode* root;
};

// Your WordDictionary object will be instantiated and called as such:
// WordDictionary wordDictionary;
// wordDictionary.addWord("word");
// wordDictionary.search("pattern");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: