[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树来存放节点。只是在搜索时由于通配符可以适配任一个字符,所以需要采用回溯的方法。匹配到当前字符时,如果遇到’.’,那么就找任一个子孩子,尝试继续寻找下去。
以上。
代码如下:
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");
相关文章推荐
- scrapy学习笔记——scrapy目录含义
- 2015072706 - 美日
- 2015第31周一
- 利用Navigation Timing测量页面加载时间
- Fuel简介
- Android的网络请求库----Android-Async-Http
- 项目里用到的一些基本的AE开发功能:
- 程序员的能力拓展模型
- 在keil中观察STM32产生的PWM 用示波器观察实质频率与仿真不符 是计算值的10倍(疑惑中。。。)
- 7.27日志
- Calendar用法
- 用Fluentd实现收集日志到HDFS(下)
- 7 Reverse Integer
- android 的TextView与EditText
- 2015/07/27
- 2015072705 - 九月三日
- [工具-007] C#手机短信发送
- php时间函数
- Android中的仿微信界面
- sgu200系列题目分类