利用字典树查找唯一标记某单词的最小前缀

来源:互联网 发布:游戏角色设计软件 编辑:程序博客网 时间:2024/06/04 20:41

题目:EPI

建立字典树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;elsecur = 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");




0 0
原创粉丝点击