【题意】输入多个字符串,输出能确定每个字符串的最短前缀字符串。
样例输入:
carbohydrate
cart
carburetor
caramel
caribou
carbonic
cartilage
carbon
carriage
carton
car
carbonate
样例输出:
carbohydrate carboh
cart cart
carburetor carbu
caramel cara
caribou cari
carbonic carboni
cartilage carti
carbon carbon
carriage carr
carton carto
car car
carbonate carbona
【解题思路】
1.建字典树
2.查询每个单词
本题的查询函数:
void fid(char word[])
{
tire *p = &root;
int i;
for (i = 0;word[i];i++)
{
int t = word[i] - 'a';
if (p->next[t] == NULL)
return;
p = p->next[t];
printf("%c", word[i]);
if (p->num == 1)//此处num为1说明只有一个单词走到这个节点,那么
//这个点及之前的字符就可以唯一确定这个单词。
return;
}
完整代码:
#include<cstdio>
using namespace std;
struct tire
{
tire *next[26];
int num;
tire()
{
int i;
for (i = 0;i < 26;i++)
next[i] = NULL;
num = 0;
}
};
tire root;
char word[1005][25];//字典
void insert(char word[])
{
tire *p = &root;
int i;
for (i = 0;word[i];i++)
{
int t = word[i] - 'a';
if (p->next[t] == NULL)
p->next[t] = new tire;
p = p->next[t];
p->num++;//每当有单词建到这个结点,num加一
}
}
void fid(char word[])
{
tire *p = &root;
int i;
for (i = 0;word[i];i++)
{
int t = word[i] - 'a';
if (p->next[t] == NULL)
return;
p = p->next[t];
printf("%c", word[i]);
if (p->num == 1)//此处num为1说明只有一个单词走到这个节点,那么
//这个点及之前的字符就可以唯一确定这个单词。
return;
}
}int main()
{
int size = 1, i;
while (scanf("%s", word[size]) != EOF)
{
insert(word[size++]);
}
for (i = 1;i < size;i++)
{
printf("%s ", word[i]);
fid(word[i]);
printf("\n");
}
return 0;
}