码迷,mamicode.com
首页 > 其他好文 > 详细

1015 字典树

时间:2015-04-27 00:24:50      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

字典树:顾名思义,是通过字符来查找,不过只是统计以某个字符或字符串为前缀的单词个数,字典中无此前缀,返回0;有则返回个数。

创建树:根据所给字符串,依次遍历字符串件数,如果存在,num++,查看下一个字符。不存在,建立新的节点,n++,查看下一节点。

直到遍历完字符串为止。

查看:大体操作和创建一样,遍历完字符串,存在返回num,不存在返回0;

这只是一个英文字典查询,如果为世界所有字符,便会出错,可以把节点内的child数组变为一个动态数组,然后,和英文字典一样,不过我还没弄会,研究中、、、、、、、、、、

源代码:

 

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

//创建字典树节点
typedef struct Trie{
int num;//记录个数
struct Trie *child[26];//26个字母分支 
Trie (){
for(int i=0;i<26;i++){//初始化
child[i]=NULL;
}
}
}Trie;

//创建字典树
void create(string str,Trie *trie){
Trie *p=trie;
for(int i=0;i<(str.length());i++){
int temp=str[i]-‘a‘;//判断为那个字符
if(p->child[temp]==NULL){//判断是否存在
p->child[temp]=new Trie;
}
p=p->child[temp];//根节点不需要总个数,那代表的是整个字典含有的单词数;故直接连接到字符分支;
p->num ++;
}
}

 

//根据前缀查找
int check(string str,Trie *trie){
Trie *p=trie;
for(int i=0;i<(str.length());i++){//遍历所给的字符串
int temp=str[i]-‘a‘;
if(p->child[temp]==NULL){//判断是否存在,否:0;是:下一个字符;
return 0;
}
p=p->child[temp];
}
return p->num;
}
int main(void){
Trie *trie=new Trie;
int n,m;
string str;
cin>>n;//字典最多含有单词数
while(n--){
cin>>str;
create(str,trie);
}
cin>>m;//查找单词数
while(m--){
cin>>str;
cout<<check(str,trie)<<endl;
}
}

 

注:对c++的一些函数使用不熟悉,str.length();最初写成了 ‘str.length’;length是个函数,不是个属性。

 

1015 字典树

标签:

原文地址:http://www.cnblogs.com/LifeLeaving/p/4458695.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!