2019.5.3 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
数据结构题。
之前有做过字符串的前缀问题,前缀树由该题延伸而来,具体可以看:LeetCode(14):最长公共前缀 Longest Common Prefix(Java)
前缀树的存在主要是为了解决:给定键值字符串S=[S1……Sn],找字符串q与S的最长公共前缀的问题。前缀树实现包括结点类和前缀树类,实现方式如下:
TrieNode 树节点类
类型/返回类型 | 成员/方法 | 说明/实现方式 |
---|---|---|
int | R | 代表可能的字符值数量,决定links长度,一般为26(26个字母) |
TrieNode[] | links | TrieNode数组在构造函数中初始化长为R,位置代表当前字母,值存放指向子结点的指针 |
boolean | isEnd | 当isEnd为true时,当前结点为该键值的尾结点(尾结点links数组不存值) |
boolean | containsKey(char ch) | 判断当前结点对应字符是否为ch,若link对应位置不为null则返回true |
TrieNode | get(char ch) | 返回字母ch对应的子结点 |
void | put(char ch, TrieNode node) | 将字母ch对应位置放入新子结点 |
void | setEnd() | 将当前结点设置为尾结点 |
boolean | isEnd() | 判断当前结点是否尾结点 |
Trie 前缀树类
类型/返回类型 | 成员/方法 | 说明/实现方式 |
---|---|---|
TrieNode | root | 前缀树根节点 |
void | insert(String word) | 将键值字符串插入前缀树 |
TrieNode | searchPrefix(String word) | 判断前缀树中是否存在word对应的前缀码,若存在则返回验证后的最尾结点(isEnd不确定),若不存在则返回null |
boolean | search(String word) | 判断前缀树中是否存在word对应的完整键值。通过searchPrefix前缀返回最尾结点,当该结点不为null且isEnd为true时,返回true |
boolean | startsWith(String prefix) | 判断前缀树中是否存在word对应的前缀。通过searchPrefix前缀返回最尾结点,当该结点不为null时,返回true |
Implement a trie with insert, search, and startsWith methods.
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
示例:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // 返回 true
trie.search("app"); // 返回 false
trie.startsWith("app"); // 返回 true
trie.insert("app");
trie.search("app"); // 返回 true
说明:
你可以假设所有的输入都是由小写字母 a-z 构成的。
保证所有输入均为非空字符串。
/**
*
* @author ChopinXBP
* Implement a trie with insert, search, and startsWith methods.
* Note: You may assume that all inputs are consist of lowercase letters a-z. All inputs are guaranteed to be non-empty strings.
* 实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
* 说明: 你可以假设所有的输入都是由小写字母 a-z 构成的。保证所有输入均为非空字符串。
* https://leetcode.com/articles/implement-trie-prefix-tree/
*
*/
public class PrefixTree {
public static void main(String[] args)