Я только начал изучать сложные структуры данных, и это моя первая реализация Trie.Я пытался реализовать Trie, который поддерживает вставку, удаление и обновление.Однако я не могу найти эффективный способ обновления oldStrings в newStrings.Я могу только просто удалить (oldString) и вставить (newString).
Есть ли эффективный способ сделать то же самое?
Это класс TrieNode
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class TrieNode{
private Map<Character, TrieNode> children;
private boolean wordBreak;
private int count;
TrieNode(){
this.children = new HashMap<>();
this.wordBreak = false;
this.count = 0;
}
public Map<Character, TrieNode> getChildren() {
return children;
}
public boolean isWordBreak() {
return wordBreak;
}
public void setWordBreak(boolean wordBreak) {
this.wordBreak = wordBreak;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
Это класс Trie
public class Trie{
private final TrieNode root;
Trie(){
root = new TrieNode();
}
public void insert(String word){
TrieNode current = root;
for(char c : word.toCharArray()){
TrieNode node = current.getChildren().get(c);
if(node == null) {
node = new TrieNode();
current.getChildren().put(c, node);
}
current = node;
}
current.setWordBreak(true);
current.setCount(current.getCount() + 1);
}
public void update(String oldWord, String newWord){
delete(oldWord);
insert(newWord);
}
public int query(String word){
TrieNode current = root;
for(char c : word.toCharArray()){
TrieNode node = current.getChildren().get(c);
if(node == null)
return 0;
current = node;
}
return current.isWordBreak() ? current.getCount() : 0;
}
private boolean delete(TrieNode current, String word, int index){
if(index == word.length()){
if(!current.isWordBreak())
return false;
current.setWordBreak(false);
current.setCount(current.getCount() - 1);
return current.getChildren().size() == 0;
}
char c = word.charAt(index);
TrieNode node = current.getChildren().get(c);
if(node == null)
return false;
boolean isSafeToDelete = delete(node, word, index + 1);
if(isSafeToDelete){
current.getChildren().remove(c);
current.setCount(current.getCount() - 1);
return current.getChildren().size() == 0;
}
return false;
}
public void delete(String word){
delete(root, word, 0);
}