这里有两道字典树的模板题
字典树(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]; //返回是否存在这个单词
}
}
学习愉快!!!