一道Trie树基础题
题目给出一组字符串 求每个字符的最小前缀 使得这个字符串能区别于其他的字符串
思路:建立一棵Trie树,一次查找字符串中的字母,若某个字母只出现过一次,则输出以该字母结尾的子串
#include<iostream>
using namespace std;
char str[1010][23];
int len[1010];
char ans[23];
int n = 0;
struct node
{
int num;//该字母出现的次数
node *child[26];
}*root;
void initNode()
{
root = new node;
for(int i = 0;i < 26;i++)
root->child[i] = NULL;
}
void insert(int k)
{
node *r = root,*p;
for(int i = 0;i < len[k];i++)
{
if(r->child[str[k][i] - 'a'] == NULL)
{
p = new node;
p->num = 0;
for(int j = 0;j < 26;j++)
p->child[j] = NULL;
r->child[str[k][i] - 'a'] = p;
}
r = r->child[str[k][i] - 'a'];
r->num++;
}
}
void search(int k)
{
node *r = root;
for(int i = 0;i < len[k];i++)
{
r = r->child[str[k][i] - 'a'];
ans[i] = str[k][i];
if(r->num == 1)
{
ans[i+1] = '\0';
return ;
}
}
ans[len[k]] = '\0';
}
int main()
{
initNode();
while(scanf("%s",str[n]) != EOF&&str[n][0] != '.')//题目没给出输入结束条件,自己写一个
{
len[n]=strlen(str[n]);
insert(n);
n++;
}
for(int i=0;i<n;i++){
search(i);
printf("%s %s\n",str[i],ans);
}
return 0;
}