Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana band bee absolute acm ba b band abc
Sample Output
2 3 1 0
- #define MAX 26 //字符集的大小
- /*
- 字典树的存储结构
- */
- typedef struct Node
- {
- struct Node *next[MAX]; //每个节点下面可能有MAX个字符
- int count; //以从根节点到当前节点的字符串为公共前缀的字符串数目
- }TrieNode,*TrieTree;
(插入、查找、销毁等)
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include"data_structure.h"
- /*
- 创建一棵仅有根节点的字典树
- */
- TrieTree create_TrieTree()
- {
- TrieTree pTree = (TrieTree)malloc(sizeof(TrieNode));
- pTree->count = 0;
- int i;
- for(i=0;i<MAX;i++)
- pTree->next[i] = NULL;
- return pTree;
- }
- /*
- 插入字符串str到字典树pTree中
- 由于不可能改变根节点,因此这里不需要传入pTree的引用
- */
- void insert_TrieTree(TrieTree pTree,char *str)
- {
- int i;
- TrieTree pCur = pTree; //当前访问的节点,初始指向根节点
- int len = strlen(str);
- for(i=0;i<len;i++)
- {
- int id = str[i] - 'a'; //定位到字符应该在的位置
- if(!pCur->next[id])
- { //如果该字符应该在的位置为空,则将字符插入到该位置
- int j;
- TrieNode *pNew = (TrieNode *)malloc(sizeof(TrieNode));
- if(!pNew)
- {
- printf("pNew malloc fail\n");
- exit(-1);
- }
- pNew->count = 1;
- for(j=0;j<MAX;j++)
- pNew->next[j] = NULL;
- //指针后移,比较下一个字符
- pCur->next[id] = pNew;
- pCur = pCur->next[id];
- }
- else
- { //如果该字符应该在的位置不空,则继续比较下一个字符
- pCur = pCur->next[id];
- pCur->count++; //每插入一个字符,公共前缀数目就加1
- }
- }
- }
- /*
- 统计字典树pTree中以str为前缀的字符串的数目
- */
- int count_TrieTree(TrieTree pTree,char *str)
- {
- int i;
- TrieTree pCur = pTree;
- int len = strlen(str);
- for(i=0;i<len;i++)
- {
- int id = str[i] - 'a';
- if(!pCur->next[id])
- return 0;
- else
- pCur = pCur->next[id];
- }
- return pCur->count;
- }
- /*
- 销毁字典树
- */
- void destroy_TrieTree(TrieTree pTree)
- {
- int i;
- //递归释放每个节点的内存
- for(i=0;i<MAX;i++)
- if(pTree->next[i])
- destroy_TrieTree(pTree->next[i]);
- free(pTree);
- }
int main()
{
char str[10];
TrieTree pTree = create_TrieTree();
printf("Please input all string:\n");
while(gets(str) && str[0] != '\0')
insert_TrieTree(pTree,str);
printf("\nplease intput prefix string:\n");
while(gets(str) && str[0] != '\0')
printf("The num of strings started with %s is %d\n",str,count_TrieTree(pTree,str));
destroy_TrieTree(pTree);
return 0;
}