You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
package 第03期.mca_08;
|
|
|
|
|
|
|
|
public class Code01_Trie {
|
|
|
|
|
|
|
|
// 测试链接 : https://leetcode.cn/problems/implement-trie-ii-prefix-tree/
|
|
|
|
// 提交Trie类可以直接通过
|
|
|
|
// 原来代码是对的,但是既然找到了直接测试的链接,那就直接测吧
|
|
|
|
// 这个链接上要求实现的功能和课上讲的完全一样
|
|
|
|
// 该前缀树的路用数组实现
|
|
|
|
class Trie {
|
|
|
|
|
|
|
|
class Node {
|
|
|
|
// 该节点通过了几次
|
|
|
|
public int pass;
|
|
|
|
// 有多少个字符串,以该节点结尾
|
|
|
|
public int end;
|
|
|
|
|
|
|
|
public Node[] nexts;
|
|
|
|
|
|
|
|
public Node() {
|
|
|
|
pass = 0;
|
|
|
|
end = 0;
|
|
|
|
nexts = new Node[26];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private Node root;
|
|
|
|
|
|
|
|
public Trie() {
|
|
|
|
root = new Node();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void insert(String word) {
|
|
|
|
if (word == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
char[] str = word.toCharArray();
|
|
|
|
Node node = root;
|
|
|
|
node.pass++;
|
|
|
|
int path = 0;
|
|
|
|
for (int i = 0; i < str.length; i++) { // 从左往右遍历字符
|
|
|
|
path = str[i] - 'a'; // 由字符,对应成走向哪条路
|
|
|
|
if (node.nexts[path] == null) {
|
|
|
|
node.nexts[path] = new Node();
|
|
|
|
}
|
|
|
|
node = node.nexts[path];
|
|
|
|
node.pass++;
|
|
|
|
}
|
|
|
|
node.end++;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void erase(String word) {
|
|
|
|
if (countWordsEqualTo(word) != 0) {
|
|
|
|
char[] chs = word.toCharArray();
|
|
|
|
Node node = root;
|
|
|
|
node.pass--;
|
|
|
|
int path = 0;
|
|
|
|
for (int i = 0; i < chs.length; i++) {
|
|
|
|
path = chs[i] - 'a';
|
|
|
|
if (--node.nexts[path].pass == 0) {
|
|
|
|
node.nexts[path] = null;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
node = node.nexts[path];
|
|
|
|
}
|
|
|
|
node.end--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public int countWordsEqualTo(String word) {
|
|
|
|
if (word == null) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
char[] chs = word.toCharArray();
|
|
|
|
Node node = root;
|
|
|
|
int index = 0;
|
|
|
|
for (int i = 0; i < chs.length; i++) {
|
|
|
|
index = chs[i] - 'a';
|
|
|
|
if (node.nexts[index] == null) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
node = node.nexts[index];
|
|
|
|
}
|
|
|
|
return node.end;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int countWordsStartingWith(String pre) {
|
|
|
|
if (pre == null) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
char[] chs = pre.toCharArray();
|
|
|
|
Node node = root;
|
|
|
|
int index = 0;
|
|
|
|
for (int i = 0; i < chs.length; i++) {
|
|
|
|
index = chs[i] - 'a';
|
|
|
|
if (node.nexts[index] == null) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
node = node.nexts[index];
|
|
|
|
}
|
|
|
|
return node.pass;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|