- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我希望使用以下代码不检查 Trie 中是否存在单词匹配,而是返回以用户输入的前缀开头的所有单词的列表。有人能指出我正确的方向吗?我根本无法让它工作......
public boolean search(String s)
{
Node current = root;
System.out.println("\nSearching for string: "+s);
while(current != null)
{
for(int i=0;i<s.length();i++)
{
if(current.child[(int)(s.charAt(i)-'a')] == null)
{
System.out.println("Cannot find string: "+s);
return false;
}
else
{
current = current.child[(int)(s.charAt(i)-'a')];
System.out.println("Found character: "+ current.content);
}
}
// If we are here, the string exists.
// But to ensure unwanted substrings are not found:
if (current.marker == true)
{
System.out.println("Found string: "+s);
return true;
}
else
{
System.out.println("Cannot find string: "+s +"(only present as a substring)");
return false;
}
}
return false;
}
}
最佳答案
我在尝试制作文本自动完成模块时遇到了这个问题。我通过制作一个 Trie 解决了这个问题,其中每个节点都包含它的父节点和子节点。首先,我搜索了从输入前缀开始的节点。然后我在 Trie 上应用了一个遍历,它以它的根作为前缀节点来探索子树的所有节点。每当遇到叶节点时,就意味着找到了从输入前缀开始的单词结尾。从那个叶节点开始,我遍历父节点获取父节点的父节点,并到达子树的根。在这样做的同时,我一直在堆栈中添加节点的键。最后,我采用了前缀并开始通过弹出堆栈来附加它。我一直将单词保存在 ArrayList 中。在遍历结束时,我得到了从输入前缀开始的所有单词。这是带有用法示例的代码:
class TrieNode
{
char c;
TrieNode parent;
HashMap<Character, TrieNode> children = new HashMap<Character, TrieNode>();
boolean isLeaf;
public TrieNode() {}
public TrieNode(char c){this.c = c;}
}
-
public class Trie
{
private TrieNode root;
ArrayList<String> words;
TrieNode prefixRoot;
String curPrefix;
public Trie()
{
root = new TrieNode();
words = new ArrayList<String>();
}
// Inserts a word into the trie.
public void insert(String word)
{
HashMap<Character, TrieNode> children = root.children;
TrieNode crntparent;
crntparent = root;
//cur children parent = root
for(int i=0; i<word.length(); i++)
{
char c = word.charAt(i);
TrieNode t;
if(children.containsKey(c)){ t = children.get(c);}
else
{
t = new TrieNode(c);
t.parent = crntparent;
children.put(c, t);
}
children = t.children;
crntparent = t;
//set leaf node
if(i==word.length()-1)
t.isLeaf = true;
}
}
// Returns if the word is in the trie.
public boolean search(String word)
{
TrieNode t = searchNode(word);
if(t != null && t.isLeaf){return true;}
else{return false;}
}
// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix)
{
if(searchNode(prefix) == null) {return false;}
else{return true;}
}
public TrieNode searchNode(String str)
{
Map<Character, TrieNode> children = root.children;
TrieNode t = null;
for(int i=0; i<str.length(); i++)
{
char c = str.charAt(i);
if(children.containsKey(c))
{
t = children.get(c);
children = t.children;
}
else{return null;}
}
prefixRoot = t;
curPrefix = str;
words.clear();
return t;
}
///////////////////////////
void wordsFinderTraversal(TrieNode node, int offset)
{
// print(node, offset);
if(node.isLeaf==true)
{
//println("leaf node found");
TrieNode altair;
altair = node;
Stack<String> hstack = new Stack<String>();
while(altair != prefixRoot)
{
//println(altair.c);
hstack.push( Character.toString(altair.c) );
altair = altair.parent;
}
String wrd = curPrefix;
while(hstack.empty()==false)
{
wrd = wrd + hstack.pop();
}
//println(wrd);
words.add(wrd);
}
Set<Character> kset = node.children.keySet();
//println(node.c); println(node.isLeaf);println(kset);
Iterator itr = kset.iterator();
ArrayList<Character> aloc = new ArrayList<Character>();
while(itr.hasNext())
{
Character ch = (Character)itr.next();
aloc.add(ch);
//println(ch);
}
// here you can play with the order of the children
for( int i=0;i<aloc.size();i++)
{
wordsFinderTraversal(node.children.get(aloc.get(i)), offset + 2);
}
}
void displayFoundWords()
{
println("_______________");
for(int i=0;i<words.size();i++)
{
println(words.get(i));
}
println("________________");
}
}//
例子
Trie prefixTree;
prefixTree = new Trie();
prefixTree.insert("GOING");
prefixTree.insert("GONG");
prefixTree.insert("PAKISTAN");
prefixTree.insert("SHANGHAI");
prefixTree.insert("GONDAL");
prefixTree.insert("GODAY");
prefixTree.insert("GODZILLA");
if( prefixTree.startsWith("GO")==true)
{
TrieNode tn = prefixTree.searchNode("GO");
prefixTree.wordsFinderTraversal(tn,0);
prefixTree.displayFoundWords();
}
if( prefixTree.startsWith("GOD")==true)
{
TrieNode tn = prefixTree.searchNode("GOD");
prefixTree.wordsFinderTraversal(tn,0);
prefixTree.displayFoundWords();
}
关于java - 从 Trie 中获取单词列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794381/
我正在尝试做的事情: 构建一个移动网络应用程序,用户可以在玩拼字游戏时获得帮助找到要玩的单词 用户通过输入任意数量的字母和 0 个或多个通配符来获得单词建议 我是如何尝试做到这一点的: 使用 MySQ
假设我有一个 trie 包含多个字符串的数据结构。要在 trie 中查找字符串,我会从根开始,然后按顺序跟随标有字符串适当字符的指针,直到到达给定节点。 现在假设我想为同一组字符串构建一个“反向 tr
我正在阅读 Ingersoll、Morton 和 Farris 撰写的 Taming Text,但我不明白 solr 的数字 trie 实现如何帮助搜索文本?我对 solr.TrieField fie
我正在阅读 Ingersoll、Morton 和 Farris 的 Taming Text,但我不明白 solr 的数字 trie 实现如何帮助搜索文本?我对 solr 的 solr.TrieFiel
我正在开发一个 Trie 数据结构,其中每个节点代表一个词。所以词 st, stack, stackoverflow 和 overflow 将被排列为 root --st ---stack -----
trie 和radix trie 数据结构是一回事吗? 如果它们不相同,那么 radix trie (AKA Patricia trie) 是什么意思? 最佳答案 基数树是 trie 的压缩版本。在
我用过 video理解前缀特里树(虽然最终我试图最终得到后缀特里树)但是示例代码的链接被破坏所以我从视频中想出了这个,有两个功能,即插入和搜索如下 void insert(string word)
本文关键词:Leetcode, 力扣,Trie, 前缀树,字典树,208,Python, C++, Java 题目地址:https://leetcode.com/problems/implement
这是我使用 trie.c 和 trie.h 制作的主文件。该程序的目的是存储字典文件中的单词。 node* x = (node*)malloc(sizeof(node)); x = insert("b
因此,我必须搜索缺少字母(用于填字游戏)的单词,并且还必须维护剩余空格的可能单词列表。 现在我的问题是,我已经用谷歌搜索了 burst-trie 是否是最快的搜索算法。但是,如果我在 trie 中编写
我正在尝试将这个 trie 实现用于 ocaml:http://www.lri.fr/~filliatr/ftp/ocaml/ds/trie.ml.html 这是我对模块“M”的实现: module
我试图将 trie 中的所有单词放入字符串中,单词由 eow 字段表示,对于 trie 数据结构中的某个字符为 true,因此 trie 可以有字母但没有单词,例如“abc”在 trie 中,但“c”
我不太了解尝试字符串匹配中使用的实际算法。 我想知道为什么似乎更关注字符串匹配的后缀尝试而不是前缀尝试。我们可以不使用前缀尝试来进行子字符串匹配吗?换句话说,后缀尝试相对于前缀尝试有什么优势? 最佳答
当你构建一个特里树时,你是否将字符串/句子存储在其分支的末尾,以便在分支的末尾轻松访问它?有些人这样做,我有时也这样做,但我应该这样做吗? 有时(尤其是使用 LeetCode),我会收到此错误: Li
鉴于以下情况... (def inTree '((1 2) (1 2 3) (1 2 4 5 9) (1 2 4 10 15) (1 2 4 20 25))) 你如何将它转换
我想为高棉语(一种单词之间没有空格的语言)添加一个开源 Java 单词分割程序。开发人员已经很长时间没有开发它了,我无法联系他们了解详细信息(http://sourceforge.net/projec
我有一个字典文件(仅包含小写字母和撇号的单词),它作为特里树加载。 我有一个检查函数,它检查文件中的单词是否存在于特里树中树,无论字母大小写。 一切正常,除了撇号的单词总是拼写错误。 这是我的函数 b
我一直在练习 trie 数据结构(与类(class)作业无关)。此类用于存储字符串的子字符串。对于长度为 n 的字符串,总共有 n(n+1)/2 个子字符串。特别是 trie 的这种实现保留了自然顺序
所以我创建了一个包含大量数据的 trie,我的搜索算法非常快,但我想看看是否有人知道我如何才能让它更快。 bool search (string word) { int wordLen
我正在尝试用 C++ 实现 Trie,但出现运行时错误... 这是我的代码: #include using namespace std; struct trie{ bool word = f
我是一名优秀的程序员,十分优秀!