利用字典树查找唯一标记某单词的最小前缀
2014-12-30 21:55
453 查看
题目:EPI
建立字典树Trie以及利用其查找唯一标记某单词的最小前缀。
建立字典树Trie以及利用其查找唯一标记某单词的最小前缀。
class TireNode { public: bool isString; unordered_map<char, shared_ptr<TireNode>> m; TireNode(bool b) :isString(b){} }; class Tire { public: shared_ptr<TireNode> root; Tire() :root(new TireNode(false)){}//重要 bool insert(const string &s) { shared_ptr<TireNode> cur = root; for (int i = 0; i < s.size(); i++) { char c = s[i]; if (cur->m.find(c) == cur->m.end()) { shared_ptr<TireNode> tmp(new TireNode(false)); cur->m[c] = tmp; } cur = cur->m[c]; } if (cur->isString) return false;//该字符串已经存在 else { cur->isString = true; return true; } } string get_shortest_prefix(const string &s) { if (s.empty()) return ""; string res; shared_ptr<TireNode> cur = root; for (int i = 0; i < s.size(); i++) { string tmp(1, s[i]); res += tmp; if (cur->m.find(s[i]) == cur->m.end()) return res; else cur = cur->m[s[i]]; } return ""; } }; string Find_shortest_prefix(const unordered_set<string> &D, const string &s) { if (s.empty() || D.empty()) return ""; Tire T; for (unordered_set<string>::iterator i = D.begin(); i != D.end(); i++) T.insert(*i); return T.get_shortest_prefix(s); } //测试代码 string ss[] = { "dog", "be", "cut", "car" }; unordered_set<string> D; for (int i = 0; i < 3; i++) D.emplace(ss[i]);//插入 cout << Find_shortest_prefix(D, "cat");
相关文章推荐
- Trie 树(又称字典树,单词查找树)
- 储存每一个单词W以及W的所有前缀,特定方的方向执行一次扫描的时候,如果被查找的单词作为前缀不在散列表中,那么在这个方向上可以及早终止
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
- 文件操作--利用首单词查找整行信息
- 算法——利用Trie树统计某种前缀的单词的个数
- Trie 树(又称字典树,单词查找树)
- 数据结构:Trie(单词查找树,字典树,前缀树)
- 查找字典中某个公共前缀的所有单词
- 【网易有道面试题一】求单词集可以唯一标识每个单词的最短前缀
- 字典树_Trie树_单词查找树
- Trie 前缀树/字典树/单词查找树(数据结构)
- Hash(篇1)实现一个函数来查找具有相同唯一字符集的所有单词
- hdu1671Phone List(字典树---判断有无相同的前缀单词)
- POJ 2001 Shortest Prefixes 字典树经典题,求最短唯一前缀)
- 利用Trie树,来查找单词出现的次数
- 查找字典中具有某个公共前缀的所有单词
- 跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总
- 单词的前缀 字典树
- Trie,又称字典树、单词查找树,是一种树形结构
- hdu 1251 字典树模板题 ---多串 查找单词出现次数