首先建立字典树 ,这里采用数组方式建立字典树,在建立字典树的同时统计各个单词前缀 或则 单词的出现次数
void insert(char *s) {
int root = 0;
int len = strlen(s);
for(int i = 0 ; i<len; i++) {
int id = s[i]-'a';
if(trip[root][id]==0)
trip[root][id]=tot++;
// tot为每个单词的编号 , 这里写sum数组 可以统计每个以本字母结尾的单词的个数
sum[trip[root][id]]++;
root = trip[root][id];
}
}
然后检索
void serch(char *s) {
int root=0;
int len = strlen(s);
int flag = true;
for(int i=0; i<len; i++) {
int id = s[i]-'a';
if(trip[root][id]==0)
flag = false;
root = trip[root][id];
}
if(flag)
printf("%d\n",sum[root]); // sum[root] 代表了 以当前单词为尾的单词出现的次数
else
printf("no word\n");
}
统计单词出现次数
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100;
int sum[maxn];
int trip[maxn][maxn];
int tot=1;
void insert(char *s) {
int root = 0;
int len = strlen(s);
for(int i = 0 ; i<len; i++) {
int id = s[i]-'a';
if(trip[root][id]==0)
trip[root][id]=tot++;
sum[trip[root][id]]++;
root = trip[root][id];
}
}
void serch(char *s) {
int root=0;
int len = strlen(s);
int flag = true;
for(int i=0; i<len; i++) {
int id = s[i]-'a';
if(trip[root][id]==0)
flag = false;
root = trip[root][id];
}
printf("%s 出现次数:",s);
if(flag)
printf("%d\n",sum[root]);
else
printf("不存在\n");
}
int main() {
int n,m;
char s[11];
memset(trip,0,sizeof(trip));
scanf("%d",&n);
for(int i = 0 ; i<n; i++) {
scanf("%s",s);
insert(s);
}
scanf("%d",&m);
for(int i = 0 ; i<m; i++) {
scanf("%s",s);
serch(s);
}
return 0;
}
输出样例: