23
字典树
大致理论就是“利用字符串的公共前缀来节约存储空间”。
用的是指针,数组字典树先放着QAQ
struct Trie{//结构体,每个位置的单元
Trie *nxt[26];//26是因为最大26个字母
int v;//这里只计算出现次数,实际上结构体内可以存很多信息,但需要对下面的creat和find修改
};
Trie * root;
void creatTrie(char *s){
int len=strlen(s);
// cout<<1<<endl;
Trie *p=root,*q;
for(int i=0;i<len;i++){
// cout<<"i="<<i<<endl;
int data=s[i]-'a';
// cout<<data<<endl;
if(p->nxt[data]==NULL){//如果没有则创建一个,
// cout<<1<<endl;
// mal(q,Trie);//这个是申请
q=(Trie*)malloc(sizeof(Trie));
q->v=1;
for(int j=0;j<26;j++){
q->nxt[j]=NULL;
}
p->nxt[data]=q;
p=p->nxt[data];
}else{//如果这个字母已经存在了,那么这个字母的出现次数++,指针指向下一个
p=p->nxt[data];
p->v++;
}
}
}
int findTrie(char *s){//查找//
int len=strlen(s);
Trie *q=root;
for(int i=0;i<len;i++){
int data=s[i]-'a';
if(q->nxt[data]!=NULL){//如果能找到,就继续往下//
q=q->nxt[data];
}else{//没找到直接跳出循环并返回0//
return 0;
}
}
return q->v;//返回这段字符的出现次数//
}
void freeTrie(Trie *q){//释放所有空间//
if(q==NULL) return ;
for(int i=0;i<26;i++){
freeTrie(q->nxt[i]);
}
free(q);
}
void init(){//初始化//
freeTrie(root);
mal(root,Trie);
for(int i=0;i<26;i++){
root->nxt[i]=NULL;
}
}
yayaya
后面课没上然后忘记发了