Untitled
unknown
plain_text
a year ago
4.3 kB
5
Indexable
class TrieNode {
TrieNode[] children = new TrieNode[26];
boolean isEndOfWord;
int index = -1;
public TrieNode() {
isEndOfWord = false;
}
}
public class Trie {
private TrieNode root;
private int currentIndex = 0;
private int size = 0; // Biến đếm số lượng từ trong trie
public Trie() {
root = new TrieNode();
}
// Thêm từ vào trie và gán chỉ số cho từ đó
public void insert(String word) {
TrieNode current = root;
for (char c : word.toCharArray()) {
int index = c - 'a';
if (current.children[index] == null) {
current.children[index] = new TrieNode();
}
current = current.children[index];
}
if (!current.isEndOfWord) {
current.isEndOfWord = true;
current.index = currentIndex++;
size++; // Tăng biến đếm nếu từ này là từ mới
}
}
// Tìm kiếm từ và trả về chỉ số của từ nếu tìm thấy
public int get(String word) {
TrieNode current = root;
for (char c : word.toCharArray()) {
int index = c - 'a';
if (current.children[index] == null) {
return -1; // Từ không tồn tại
}
current = current.children[index];
}
return current.isEndOfWord ? current.index : -1;
}
// Kiểm tra xem từ có tồn tại hay không
public boolean contains(String word) {
TrieNode current = root;
for (char c : word.toCharArray()) {
int index = c - 'a';
if (current.children[index] == null) {
return false; // Từ không tồn tại trong trie
}
current = current.children[index];
}
return current.isEndOfWord;
}
// Xoá từ khỏi trie
public boolean delete(String word) {
if (delete(root, word, 0)) {
size--; // Giảm biến đếm nếu xoá thành công
return true;
}
return false;
}
private boolean delete(TrieNode current, String word, int index) {
if (index == word.length()) {
if (!current.isEndOfWord) {
return false;
}
current.isEndOfWord = false;
return isEmpty(current);
}
char c = word.charAt(index);
int i = c - 'a';
TrieNode node = current.children[i];
if (node == null) {
return false;
}
boolean shouldDeleteCurrentNode = delete(node, word, index + 1);
if (shouldDeleteCurrentNode) {
current.children[i] = null;
return isEmpty(current) && !current.isEndOfWord;
}
return false;
}
// Kiểm tra xem node có rỗng không (tức là không có node con)
private boolean isEmpty(TrieNode node) {
for (TrieNode child : node.children) {
if (child != null) {
return false;
}
}
return true;
}
// Cập nhật từ trong trie (sửa từ)
public void update(String oldWord, String newWord) {
delete(oldWord);
insert(newWord);
}
// Hàm clear để xóa hết dữ liệu trong trie
public void clear() {
root = new TrieNode(); // Tạo node gốc mới
currentIndex = 0; // Đặt lại chỉ số từ về 0
size = 0; // Đặt lại biến đếm về 0
}
// Hàm getSize để lấy số lượng từ hiện tại trong trie
public int getSize() {
return size;
}
public static void main(String[] args) {
Trie trie = new Trie();
// Thêm từ
trie.insert("hello");
trie.insert("world");
trie.insert("hell");
// Lấy kích thước của trie
System.out.println("Size of trie: " + trie.getSize()); // 3
// Xóa từ và kiểm tra lại kích thước
trie.delete("world");
System.out.println("Size of trie after deleting 'world': " + trie.getSize()); // 2
// Clear trie và kiểm tra kích thước
trie.clear();
System.out.println("Size of trie after clear: " + trie.getSize()); // 0
}
}
Editor is loading...
Leave a Comment