Leetcode211 - Add and Search Word - Data structure design
来源:互联网 发布:macbook 软件 编辑:程序博客网 时间:2024/06/05 02:03
我的新博客地址:HuHaoyu’s Blog,最近新增了Jekyll的paginator分页功能和Swiftype的搜索引擎。欢迎参观!
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") -> falsesearch("bad") -> truesearch(".ad") -> truesearch("b..") -> true
Note:
You may assume that all words are consist of lowercase letters a-z
.
题意
设计一种数据结构支持如下两个操作:
void addWord(word)bool search(word)
search(word)
可以搜索普通字母 a-z
或 .
。其中, .
可以代表任意一个字母。
举例如下:
addWord("bad")addWord("dad")addWord("mad")search("pad") -> falsesearch("bad") -> truesearch(".ad") -> truesearch("b..") -> true
提示:
提供的所有单词都是由小写字母 a-z
组成。
分析
不管用hash还是trie,插入(addWord(string word)
)的时间复杂度最好就是Σni
,即所有字典集元素的字符个数。而查找(search(string word)
)的时间复杂度则不同。由于.
的存在,使得hash的O(1)查找失去了优势。而Trie Tree
则可以在遇到.
时递归地搜索对应节点下的每一个letter。因此最后决定采用字典树作为数据结构。
非常无语的是在submit solution时,总报错invalid types ‘TrieNode* [26][<unresolved overloaded function type>]’ for array subscript
,原本以为语法写错了,最后才发现原来某处index
写成了inedex
。并不知道为什么会报这种错误=.=。
AC代码
class TrieNode {public: TrieNode() { isTail = false; for (TrieNode *&letter : letters) { letter = NULL; } } bool isTail; TrieNode *letters[26];};class WordDictionary {public: WordDictionary() { root = new TrieNode(); } // Adds a word into the data structure. void addWord(string word) { TrieNode *curr = root; for (char letter : word) { int index = find(letter); if (!curr->letters[index]) { curr->letters[index] = new TrieNode(); } curr = curr->letters[index]; } curr->isTail = 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) { return dfs_search(word, 0, root); }private: TrieNode *root; int find(char letter) { return static_cast<int>(letter - 'a'); } bool dfs_search(string word, int i, TrieNode *curr) { if (!curr) return false; if (word.size() == i) { return curr->isTail; } if (word[i] != '.') { return dfs_search(word, i + 1, curr->letters[find(word[i])]); } else { for (int k = 0; k != 26; ++k) { if (curr->letters[k] && dfs_search(word, i + 1, curr->letters[k])) { return true; } } } return false; }};// 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
- LeetCode211:Add and Search Word - Data structure design
- LeetCode211. Add and Search Word - Data structure design前缀树(Trie,字典树)实战
- Add and Search Word - Data structure design
- Add and Search Word - Data structure design
- Add and Search Word - Data structure design
- Add and Search Word - Data structure design
- Add and Search Word - Data structure design
- Add and Search Word - Data structure design
- Add and Search Word - Data structure design
- Add and Search Word - Data structure design
- Add and Search Word - Data structure design
- Add and Search Word - Data structure design
- Add and Search Word - Data structure design
- Leetcode211. Add and Search Word
- LeetCode211. Add and Search Word
- LeetCode 211 - Add and Search Word - Data structure design
- LeetCode Add and Search Word - Data structure design
- Google官方统计Android版本分布
- 运行classify.py时报错 Mean shape incompatible with input shape
- 计算几何算法概览
- ZigBee协议栈的安装调试
- CentOS7 VM安装后无法上网
- Leetcode211 - Add and Search Word - Data structure design
- UML类图几种关系的总结
- Hadoop之——HDFS
- OC面试题1
- 欢迎使用CSDN-markdown编辑器
- POJ 3074&&2676 数独DFS
- Android文件上传与下载
- iOS 从url异步获取图片
- 1038. 统计同成绩学生(20)