经典的字典树题目。。
字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
#include <iostream>
#include <map>
#include <cstring>
#include <cstdio>
#include <string>
#include <malloc.h>
using namespace std;
const int MAX=26;
struct Trie
{
Trie *next[MAX];//子字典树
int v; //根据需要变化
};
Trie *root;//根节点
void createTrie(char *str)
{
int len = strlen(str);
Trie *p = root, *q;
if(len==0)return ;
for(int i=0; i<len; i++)
{
int id = str[i]-'a';
if(p->next[id] == NULL)//未出现的节点
{
q = (Trie *)malloc(sizeof(Trie));
for(int j=0; j<MAX; ++j)//建p的子树
q->next[j] = NULL;
p->next[id] = q;
p=q;
p->v = 1;//初始化
}
else//已经出现
{
p = p->next[id];
p->v++;
}
}
return ;
}
int findTrie(char *str)
{
int len = strlen(str);
if(len==0)return 0;
Trie *p = root;
for(int i=0; i<len; ++i)
{
int id = str[i]-'a';
if(p->next[id]==NULL ) //若为空集,表示不存以此为前缀的串
return 0;
else
p=p->next[id];
}
return p->v; //此串是字符集中某串的前缀
}
int main()
{
//根的初始化
root =( Trie *)malloc(sizeof( Trie));
for(int i=0;i<MAX;i++)
{
root->next[i]=NULL;
}
root->v =1;
char s[300];
while(gets(s)&&s[0]!='\0')
{
createTrie(s);//插入
}
while(scanf("%s",s)!=EOF)
{
cout<<findTrie(s)<<endl;//查找
}
return 0;
}