字符串唯一前缀问题;一道Trie树笔试题;

一个文件里面有如下字符串
cartefdxh
cart
carlkijfwe
chdfwef
cafkekfld
…………

要从文件中找出唯一能代表该字符串的前缀,然后如下输出
cartefdxh carte
cart cart
carlkijfwe carl
chdfwef ch
cafkekfld caf

以空格分隔…….

 

 

#include <iostream> #include <vector> #include <string> using namespace std; struct Trie { int flag; struct Trie* next[26]; void init() { memset(next,0,sizeof(next)); flag=0; } }trie[10000]; int k=1; struct Trie *root=&trie[0]; void insert(string &str) { struct Trie *p=root; int i=0; int j; while(str[i]!=’/0′) { j=str[i]-‘a’; if(p->next[j]==0) { trie[k].init(); p->next[j]=&trie[k++]; } p=p->next[j]; ++p->flag; ++i; } } int find(string &str) { struct Trie *p=root; int i=0,j; while(str[i]!=’/0′) { j=str[i]-‘a’; p=p->next[j]; if(p->flag==1) { return i+1; } ++i; } return i; } int main() { vector<string> v; string str; root->init(); int n; cin>>n; for(int i=0;i<n;++i) { cin>>str; v.push_back(str); insert(str); } for(int j=0;j<n;++j) { cout<<v[j]<<” “; int k=find(v[j]); cout<<v[j].substr(0,k)<<endl; } return 0; }

 

 

Trie的灵活使用,给每个结点一个标记flag,如果flag==1,说明只有一个单词以这个前缀为前缀,就找到了.

如果找到单词末尾,都未找到flag==1的,说明没有唯一前缀,打印出自身表示无奈!

 

效率真是优秀,内存量很大,思想很好,学习了.

    原文作者:Trie树
    原文地址: https://blog.csdn.net/qq120848369/article/details/5644486
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞