一个文件里面有如下字符串
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的,说明没有唯一前缀,打印出自身表示无奈!
效率真是优秀,内存量很大,思想很好,学习了.