18-2-23~3-1一周算法总结(字典树)

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

后面课没上然后忘记发了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值