核心算法
class TrieNode { // 最标准写法
private TrieNode[] children;
private boolean isEnd;// 字符的结尾
public TrieNode() {
isEnd = false;
children = new TrieNode[26]; // 巧妙的用数组的下标作为26个字母;数组的值则为子节点,每一个子节点都可以扩展 26个;
}
/**
* 构建一个基于 字符下标的的数组,并构成树形结构
*
* @param word
*/
public void insert(String word) {
// 顶层数据;
TrieNode node = this;
// 循环字符串
for (int i = 0; i < word.length(); i++) {
int c = word.charAt(i) - 'a'; // 将字符串 的字符 转换成数字;,比较的时候也是这样;
if (node.children[c] == null) {
node.children[c] = new TrieNode(); // 如果当前node 的 children 没有此字符, 那么就给当前新增一个对象
}
node = node.children[c]; // 将字符对应的 node节点,重置为当前节点, 等待下一轮数据;
}
node.isEnd = true; // 字符串的最后一个字符坐标 状态设置为 true
}
public boolean search(String word) {
TrieNode node = searchPrefix(word);
return node != null && node.isEnd;
}
public boolean startsWith(String prefix) {
return searchPrefix(prefix) != null;
}
public TrieNode searchPrefix(String prefix) {
// 最外一层对象;
TrieNode node = this;
for (int i = 0; i < prefix.length(); i++) {
int c = prefix.charAt(i) - 'a'; // 将字符串用转换成数字;
// 如果没有找到,那么就结束了
if (node.children[c] == null) {
return null;
}
// 如果找到了,就进入下一层去找;
node = node.children[c];
}
return node;
}
验证
public static void main(String[] args) {
TrieNode trieNode = new TrieNode();
trieNode.insert("hello");
trieNode.insert("node");
boolean a =trieNode.startsWith("noe");
System.out.println(a);
// System.out.println(trieNode);
}