这个答案通过使用 trie 来提高性能会增加一点复杂性,这可能非常巨大。假设 M 前缀词,每个词与搜索词的平均 N 字母一起,使用 set 的上述过程的复杂性需要 O(N^2) 时间来查找 N 字母词的前缀。 Trie 方法的初始预处理成本为 O(MN),可以将搜索降低到 O(N)。
有趣的是,Trie 构建部分(下面的 Node 结构和 insert 函数)实际上只需要 7 行。
struct Node
{
bool is_Leaf = false;
unordered_map<char,Node*> transitions;
};
void insert(Node* node,char* str,char* end){
if(str==end) {node->is_Leaf = true;return ;}
if (node->transitions[*str]==nullptr) node->transitions[*str] = new Node();
insert(node->transitions[*str],str+1,end);
}
void search(Node* root,char* str,char* end,string so_far=""){
if(root && root->is_Leaf) cout<<so_far<<endl;
if(!root or str==end) return;
so_far.push_back(*str);
search(root->transitions[*str],str+1,end,so_far);
}
int main(int argc, char const *argv[])
{
Node* root = new Node();
vector<string> prefixes = {"a", "ab", "ba", "aba", "bbb"};
for(auto& s:prefixes) insert(root,&s[0],&s[0]+s.size());
string to_search = "abad";
search(root,&to_search[0],&to_search[0]+to_search.size(),"");
return 0;
}