TrieMap 中的一个小 Bug
kerraway opened this issue · comments
kerraway commented
文件:10-Trie/Optional-02-Trie-Delete/src/RandomizedSet_Trie.java
行数:121 行后
方法:#remove(String)
问题:应该缺少 stack.pop();
// 删除word, 返回是否删除成功
public boolean remove(String word){
Stack<Node> stack = new Stack<>();
stack.push(root);
for(int i = 0; i < word.length(); i ++){
if(!stack.peek().next.containsKey(word.charAt(i)))
return false;
stack.push(stack.peek().next.get(word.charAt(i)));
}
if(!stack.peek().isWord)
return false;
// 将该单词结尾isWord置空
stack.peek().isWord = false;
size --;
// 如果单词最后一个字母的节点的next非空,
// 说明trie中还存储了其他以该单词为前缀的单词,直接返回
if(stack.peek().next.size() > 0)
return true;
else
stack.pop();
// 自底向上删除
for(int i = word.length() - 1; i >= 0; i --){
stack.peek().next.remove(word.charAt(i));
// 如果上一个节点的isWord为true,或者是其他单词的前缀,则直接返回
if(stack.peek().isWord || stack.peek().next.size() > 0)
return true;
// ==============
stack.pop();
// ==============
}
return true;
}
Yubo Liu commented
非常感谢,你是正确的。现在已经修复:)
如果愿意,可以加一个微信好友:liuyubobobo