您的位置:首页 > 其它

Leetcode: Add and Search Word - Data structure design

2015-05-21 20:28 561 查看
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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: