字典树 浅学

这篇博客介绍了如何使用字典树(Trie)数据结构来高效地进行字符串插入和查找操作。通过给出的C++代码示例,展示了如何构建和使用字典树,包括insert和find两个关键方法。字典树在解决字符串集合查询问题时具有较高的效率,适合于单词搜索和存在性判断等场景。
摘要由CSDN通过智能技术生成

这里有两道字典树的模板题

  • 洛谷3879
  • 洛谷2580
    其实都可以用STL 的map 来做,不过要是想练习以下字典树还是老实用字典树做叭

字典树(Trie)

图片来自 OI Wiki

在这里插入图片描述
意思就是这么个意思,可以便于我们查找一个单词是否存在,一般有两个方法: insert 和 find, 可以结合题目具体理解含义,下面通过代码和注释的方式给出字典树的实现

/*

建议先看下代码再看下面的解释

字典树(trie)
需要注意的是,字典树的每个 不同层次的相同字符 和 同一层次的不同节点 的编号都是不同的

如,我们把 abc abd bcd放进字典树 c(x,y) x代表他的编号,y代表他指向节点的编号

    abc    a(0,1) -> b(1,2) -> c(2,3)  exise[3] = 1;  cnt = 3
    abd                     -> d(2,4)  exist[4] = 1;  cnt = 4
    bcd    b(0,5) -> c(5,6) -> d(6,7)  exist[7] = 1;  cnt = 7

*/
struct trie {
	int nex[100000][26], cnt = 0;  //nex[p][c]存放的是节点编号为p的字符c所指向的下一个节点,为什么第二维26就对应着26个英文单词
	int exist[100000]; //表示以编号P结尾的单词是否存在

	void insert(string str) {
		int len = str.length();
		int p = 0;
		for (int i = 0 ; i < len ; i++) {
			int c = str[i]-'a';  //c就是字符对应的整数
			if (!nex[p][c]) nex[p][c] = ++cnt;  //如果还没对这个字符编号,就先编号
			p = nex[p][c];
		}
	}
	bool find(string str) {
		int len = str.length();
		int p = 0;
		for (int i = 0 ; i < len; i++) {
			 int c = str[i]-'a';
			 if (!nex[p][c]) return false;  //不存在这个节点说明就不存在这个单词,直接返回
			 p = nex[p][c];
		}
		return exist[p][c];   //返回是否存在这个单词
	}
}

学习愉快!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值