一、题目
二、题解
1.题目类型
由题可知,我们需要实现一种用来存储字符串的数据类型,而且根据题目中查询字符串和查询prefix我们也能想到,就是构建一层一层的树结构实现存储字符串。
2.如何构建?
如果我们要存储的数据不确定种类的话,我们可以在一层中用map存储,key存储数据(Object),value存储是否为叶结点(boolean) 。但是现在我们已经确定要存储的数据为26个小写英文字母,那么我们就拿一个固定大小为26的Trie数组和一个flag来代替map,a代表childrens[0],b代表childrens[1]...依次类推,然后flag代表当前字母是不是最后一个。
3.代码
注意事项:我们要创建一个Trie对象来保存我们当前的位置,这样方便迭代进入下一层
public class P208_ImplementTriePrefixTree {
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Trie {
private Trie[] childrens;
private Boolean end;
public Trie() { //初始化 26个字母
//并不是真正的存储abcd...而是用0~25这26个下标去代表abcd..。
this.childrens = new Trie[26];
this.end = false;
}
public void insert(String word) {
//用来表示达到了第几层
Trie node = this;
for (int i = 0; i < word.length(); i++) {
//获取当前字母对应0~25的下标
int idx = word.charAt(i) - 'a';
//查看是否存在当前字母
if (node.childrens[idx] == null) {
//初始化
node.childrens[idx] = new Trie();
}
node = node.childrens[idx];
}
//到达最后一个字母,标记为end
node.end = true;
}
public boolean search(String word) {
//用来记录当前层数的Trie
Trie node = this;
for (int i = 0; i < word.length(); i++) {
int idx = word.charAt(i) - 'a';
if (node.childrens[idx] == null) { //不存在
return false;
}
node = node.childrens[idx];
}
//node不为null且当前字典是最后一个
return node != null && node.end;
}
public boolean startsWith(String prefix) {
//记录当前层
Trie node = this;
for (int i = 0; i < prefix.length(); i++) {
int idx = prefix.charAt(i) - 'a';
if (node.childrens[idx] == null) {
return false;
}
node = node.childrens[idx];
}
return node != null;
}
}
/**
* Your Trie object will be instantiated and called as such:
* Trie obj = new Trie();
* obj.insert(word);
* boolean param_2 = obj.search(word);
* boolean param_3 = obj.startsWith(prefix);
*/
//leetcode submit region end(Prohibit modification and deletion)
}