LeetCode211. Add and Search Word - Data structure design前缀树(Trie,字典树)实战
2016-01-11 22:39
585 查看
Design a data structure that supports the following two operations:
search(word) can search a literal word or a regular expression string containing only letters
A
For example:
Note:
You may assume that all words are consist of lowercase letters
struct TrieNode
{
bool hasValue = false;
TrieNode *children[26];
TrieNode() {
memset(children, 0, sizeof(children));
}
~ TrieNode() {
}
};
class WordDictionary {
public:
WordDictionary() {
root = new TrieNode();
}
~WordDictionary() {
delTrie(root);
}
void delTrie(TrieNode* node) {
for (int i = 0; i < 26; i++) {
if (node->children[i]) {
delTrie(node->children[i]);
}
}
delete node;
}
void addWord(const string& word)
{
TrieNode* node = root;
for (int i = 0; i < word.size(); i++) {
auto ch = node->children[word[i] - 'a'];
if (ch == nullptr) {
node->children[word[i] - 'a'] = new TrieNode();
}
node = node->children[word[i] - 'a'];
}
node->hasValue = true;
}
bool search(const string& word) {
return search(root, word);
}
private:
bool search(TrieNode* rootNode, const string& word) {
TrieNode* node = rootNode;
if (node == nullptr) {
return false;
}
for (int i = 0; i < word.size(); i++) {
if (word[i] == '.') {
for (int j = 0; j < 26; j++) {
if (node->children[j]) {
if (i == word.size() - 1)
{
if (node->children[j]->hasValue) {
return true;
}
else {
continue;
}
}
else if (search(node->children[j], word.substr(i + 1))) {
return true;
}
}
}
return false;
}
else {
if (node->children[word[i] - 'a'] == nullptr) {
return false;
}
else {
node = node->children[word[i] - 'a'];
}
}
}
return node->hasValue;
}
TrieNode *root;
};
void addWord(word) bool search(word)
search(word) can search a literal word or a regular expression string containing only letters
a-zor
..
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.
struct TrieNode
{
bool hasValue = false;
TrieNode *children[26];
TrieNode() {
memset(children, 0, sizeof(children));
}
~ TrieNode() {
}
};
class WordDictionary {
public:
WordDictionary() {
root = new TrieNode();
}
~WordDictionary() {
delTrie(root);
}
void delTrie(TrieNode* node) {
for (int i = 0; i < 26; i++) {
if (node->children[i]) {
delTrie(node->children[i]);
}
}
delete node;
}
void addWord(const string& word)
{
TrieNode* node = root;
for (int i = 0; i < word.size(); i++) {
auto ch = node->children[word[i] - 'a'];
if (ch == nullptr) {
node->children[word[i] - 'a'] = new TrieNode();
}
node = node->children[word[i] - 'a'];
}
node->hasValue = true;
}
bool search(const string& word) {
return search(root, word);
}
private:
bool search(TrieNode* rootNode, const string& word) {
TrieNode* node = rootNode;
if (node == nullptr) {
return false;
}
for (int i = 0; i < word.size(); i++) {
if (word[i] == '.') {
for (int j = 0; j < 26; j++) {
if (node->children[j]) {
if (i == word.size() - 1)
{
if (node->children[j]->hasValue) {
return true;
}
else {
continue;
}
}
else if (search(node->children[j], word.substr(i + 1))) {
return true;
}
}
}
return false;
}
else {
if (node->children[word[i] - 'a'] == nullptr) {
return false;
}
else {
node = node->children[word[i] - 'a'];
}
}
}
return node->hasValue;
}
TrieNode *root;
};
相关文章推荐
- 一个关于if else容易迷惑的问题
- 注册表的组织结构
- SQLSERVER的非聚集索引结构深度理解
- 一道sql面试题附答案
- 调整SQLServer2000运行中数据库结构
- C#基础语法:结构和类区别详解
- 深入c# 类和结构的区别总结详解
- c#结构和类的相关介绍
- C# 超高面试题收集整理
- C#中结构(struct)的部分初始化和完全初始化实例分析
- C#中类与结构的区别实例分析
- C#枚举类型与结构类型实例解析
- javascript实现表现、结构、行为分离的选项卡效果!
- 字典树的基本知识及使用C语言的相关实现
- 人人网javascript面试题 可以提前实现下
- PHP中设置一个严格30分钟过期Session面试题的4种答案
- 据说是雅虎的一份PHP面试题附答案
- 实用的js 焦点图切换效果 结构行为相分离
- php牛逼的面试题分享
- 一套比较完整的javascript面试题(部分答案)