leetcode刷题思路-----前缀树
对于大家来说,树并不陌生。以二叉树为例,它类似于链表一样将节点之间进行链接。
而前缀树,是一种意义上的多叉树,它的信息反倒是存在所谓next指针上的。
(来自力扣宫水三叶)
1. 从二叉树到前缀树
如何创建一个树呢?
//基本上是如此创建的
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(){}
TreeNode(int x){
val = x;
}
}
那么类似的,我们可以如此建立前缀树节点:
public class TrieNode {
//表明是否是树的叶子节点
boolean isEnd;
//按照字典生成26个指针,类似于left,right.
TrieNode next[] = new TrieNode[26];
TrieNode(){};
}
2.实现前缀树 相关题目
class Trie {
Node node;
public Trie() {
node = new Node();
}
//插入一个字符串
public void insert(String word) {
//用cur标记遍历位置,从根节点开始
Node cur = node;
for(int i=0; i<word.length(); i++){
//存在这个字符就继续
if(cur.next[word.charAt(i)-'a']!=null){
cur = cur.next[word.charAt(i)-'a'];
continue;
}
//不存在就建立节点
Node new_node = new Node();
cur.next[word.charAt(i)-'a'] = new_node;
cur = new_node;
}
//最后在尾部记录一下
cur.isEnd = true;
}
//查询字符串是否存在
public boolean search(String word) {
Node cur = node;
for(int i=0; i<word.length(); i++){
if(cur.next[word.charAt(i)-'a']!=null){
cur = cur.next[word.charAt(i)-'a'];
continue;
}
return false;
}
//这步很重要如果还没到底部,说明他是一个前缀例如:leet相对于leetcode.
return cur.isEnd;
}
//查询是否是前缀
public boolean startsWith(String prefix) {
Node cur = node;
for(int i=0; i<prefix.length(); i++){
if(cur.next[prefix.charAt(i)-'a']!=null){
cur = cur.next[prefix.charAt(i)-'a'];
continue;
}
return false;
}
//这里就可以直接返回true;
return true;
}
class Node{
boolean isEnd;
Node[] next = new Node[26];
Node(){};
}
}
/**
* 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);
*/
总结
对于前缀树,字典树来说,通常用于前缀,拼写检测等。它本质利用了树的性质解决字符串的遍历问题,利用空间换取时间。
但对于力扣的测试用例来说,个人感觉暴力回溯比它更好想。。。