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.

Trie这样的数据结构能够非常方便的实现字符串的查找,它的时间复杂度仅仅有O(L)。依据最以下的提示单词中仅仅有a-z的小写字母这个提示也能够想到使用Trie。

前面Trie的实现使用的递归实现的,这次尝试使用非递归实现。

主要的数据结构TrieNode也做了一些改变,由于不须要进行统计计数,仅仅须要推断是否存在以某个节点结尾的字符串,所以使用一个标示量来推断是否存在以该字符结尾的字符串就可以。

搜索字符串使用的是递归,要是没有’.’这个字符可能用非递归也比較好实现,可是加上’.’这个字符后用非递归想了会儿没想出了可是感觉用递归会非常easy求解。

最后须要注意的是node节点的含义是字符的父节点。由于Trie树的根节点是一个空字符。

runtime:100ms

class WordDictionary {
public:
class TrieNode
{
public:
TrieNode * edges[26];//子节点
bool end;//标示是否有以这个节点结尾的字符串
TrieNode(){
for(int i=0;i<26;i++)
{
edges[i]=NULL;
}
end=false;
}
}; class Trie
{
public:
Trie(){
root=new TrieNode();
}
//加入单词使用循环实现,也能够使用递归,前面创建Trie树即使用的是递归
void addWord(string word)
{
if(word.empty())
return ; TrieNode * node=root;
int pos=0;
while(pos<word.size())
{
int char_code=word[pos]-'a';
if(node->edges[char_code]!=NULL)
{
node=node->edges[char_code];
pos++;
}
else
{
node->edges[char_code]=new TrieNode();
node=node->edges[char_code];
pos++;
}
}
node->end=true;
} //搜索使用递归实现,要是没有'.'使用循环也非常easy实现,可是加上限制条件后使用递归更easy一些
bool search(string &word,int pos,TrieNode * node)
{
if(word.empty()&&node->end)
return true; int char_code=word[pos]-'a';
if(pos==word.size()&&node->end)
return true; if(char_code=='.'-'a')
{
for(int i=0;i<26;i++)
if(node->edges[i]!=NULL&&search(word,pos+1,node->edges[i]))
return true;
}
else
{
if(node->edges[char_code]!=NULL)
return search(word,pos+1,node->edges[char_code]);
}
}
TrieNode * root; }; // Adds a word into the data structure.
void addWord(string word) {
trie.addWord(word);
} // 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 trie.search(word,0,trie.root);
} private:
Trie trie;
}; // Your WordDictionary object will be instantiated and called as such:
// WordDictionary wordDictionary;
// wordDictionary.addWord("word");
// wordDictionary.search("pattern");

LeetCode211:Add and Search Word - Data structure design的更多相关文章

  1. LeetCode OJ:Add and Search Word - Data structure design(增加以及搜索单词)

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  2. LeetCode208 Implement Trie (Prefix Tree). LeetCode211 Add and Search Word - Data structure design

    字典树(Trie树相关) 208. Implement Trie (Prefix Tree) Implement a trie with insert, search, and startsWith  ...

  3. leetcode面试准备:Add and Search Word - Data structure design

    leetcode面试准备:Add and Search Word - Data structure design 1 题目 Design a data structure that supports ...

  4. 字典树(查找树) leetcode 208. Implement Trie (Prefix Tree) 、211. Add and Search Word - Data structure design

    字典树(查找树) 26个分支作用:检测字符串是否在这个字典里面插入.查找 字典树与哈希表的对比:时间复杂度:以字符来看:O(N).O(N) 以字符串来看:O(1).O(1)空间复杂度:字典树远远小于哈 ...

  5. 【LeetCode】211. Add and Search Word - Data structure design

    Add and Search Word - Data structure design Design a data structure that supports the following two ...

  6. 【刷题-LeetCode】211. Add and Search Word - Data structure design

    Add and Search Word - Data structure design Design a data structure that supports the following two ...

  7. [Swift]LeetCode211. 添加与搜索单词 - 数据结构设计 | Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

  8. Leetcode211. Add and Search Word - Data structure design 添加与搜索单词 - 数据结构设计

    设计一个支持以下两种操作的数据结构: void addWord(word) bool search(word) search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a- ...

  9. (*medium)LeetCode 211.Add and Search Word - Data structure design

    Design a data structure that supports the following two operations: void addWord(word) bool search(w ...

随机推荐

  1. Linux下I/O复用 Select与Poll

    Select #include <sys/time.h>#include <sys/types.h>#include <sys/unistd.h> int sele ...

  2. 【翻译自mos文章】 在错误的从os级别remove掉 trace file 之后,怎么找到该trace file的内容?

    在错误的从os级别remove掉 trace file 之后,怎么找到该trace file的内容? 參考原文: How to Find the Content of Trace File Gener ...

  3. Loadrunner得到server參数

    首先你得确定你所监视的server与你的測试机是在同一个局域网内, 监控windows系统: 1.监视连接前的准备工作         1)进入被监视windows系统.开启下面二个服务Remote ...

  4. TCO 2015 2D

    250分题:给一段仅仅有'0','1'构成的字符串,然后给出串上平衡点的定义:在串上找到某个点(位置是p),这个点将串分成左右两部分(能够为空),左右分别计算字符的值的和,假设左边有字符是'1',那么 ...

  5. POJ 1414 暴搜

    题意比较复杂 (但是很好理解) 大概意思是给你等边三角形(详见题目中的图). 最后一行有n个数,下一次要填的数是c. 里面预先已经填好了数字.(0为未填) 得分的标准是这个分数的连通块周围没有空的地方 ...

  6. NLog日志记录

    配置NLog         NLog支持 .Net 4.5 以及以上版本!              首先去下载NLog的DLL下载地址:http://nlog-project.org/downlo ...

  7. POJ 1611 The Suspects【并查集】

    解题思路:一共给出 n个人,m组,接下来是m组数据,每一组开头是该组共有的人 num,则接下来输入的num个数,这些数是一组的 又因为最开始只有编号为0的人携带有病毒,且只有同一组的人会相互传染,问最 ...

  8. php--方便好用的函数

    在写代码的时候经常会遇见各种各样的问题,感觉需要写函数解决,其实php中已经给出指定函数了.这些函数就需要我们日常去了解记忆. 1.获取指点年份中某月的天数 cal_days_in_month() & ...

  9. 为什么叫Unity3d为脚本语言

    初接触Unity,看到大家说的都是工作主要是写脚本语言. 一直纳闷为什么说脚本语言呢,c#可不是脚本语言啊. -- -- 后来释然,说它是脚本语言是因为传统程序都是由代码构成的(像iOS.Androi ...

  10. Mac Technology Overview

    [Mac Technology Overview]https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual ...