Java 如何正确检查trie中是否存在单词前缀?
目前,我已将Trie类的“searchPrefix”函数定义为:Java 如何正确检查trie中是否存在单词前缀?,java,trie,Java,Trie,目前,我已将Trie类的“searchPrefix”函数定义为: public Boolean searchPrefix(String word) { TrieNode temp = this.root; for(int i = 0; i < word.length(); i++){ if(temp.children.get(word.charAt(i)) == null) return false; else temp = temp.chi
public Boolean searchPrefix(String word) {
TrieNode temp = this.root;
for(int i = 0; i < word.length(); i++){
if(temp.children.get(word.charAt(i)) == null) return false;
else temp = temp.children.get(word.charAt(i));
}
return (temp.children.isEmpty()) ? false : true;
}
公共布尔搜索前缀(字符串字){
三节点温度=this.root;
for(int i=0;i
当输入字符串是trie对象内部存在的单词的前缀时,此函数应返回“true”。以下是三元组课程供参考:
class TrieNode {
Character c;
Boolean isWord = false;
HashMap<Character, TrieNode> children = new HashMap<>();
public TrieNode() {}
public TrieNode(Character c) {
this.c = c;
}
}
类三节点{
字符c;
布尔值isWord=false;
HashMap children=newhashmap();
公共三元组({}
公共三元组(字符c){
这个.c=c;
}
}
根据这个在线判断,我错误地判断给定的输入字符串是否是前缀。有人能解释一下为什么这是一种不正确的方法吗?我的想法是,当我们到达作为输入字符串结尾的节点时,如果该节点有子节点,则它是其他单词的前缀,因此我们返回true。然而,这显然是错误的。我认为您没有处理前缀在trie中是一个终端词的情况 例如,假设trie中只有一个单词
hello
。
对于searchPrefix(“hello”)
,您的实现将返回false
要修复它,还需要检查isWord
标志:
public Boolean searchPrefix(String word) {
TrieNode temp = this.root;
for (int i = 0; i < word.length(); i++){
TrieNode next = temp.children.get(word.charAt(i));
if (next == null) {
return false;
}
temp = next;
}
return !temp.children.isEmpty() || temp.isWord;
}
公共布尔搜索前缀(字符串字){
三节点温度=this.root;
for(int i=0;i
空字符串呢?它被认为是一个有效的前缀吗?指向此在线法官的链接也是无效的missing@Devstr在线法官是firecode.io。此外,由于在线法官的描述模棱两可,我不确定空字符串是否是前缀,但是使用复选框“if(word.length()<1)return true/false”似乎无法解决此问题。请参阅下面的答案