Непосредственной причиной вашей ошибки OutOfMemory является то, что у вас есть рекурсия в конструкторе вашего Trie
:
public Trie() {
links=new Trie[r];
root=new Trie();
}
Видите ли вы, что для создания Trie
вам нужно создать Trie
. Это будет продолжаться до тех пор, пока у вас не закончится память.
Тем не менее, я думаю, что вам действительно нужно немного реструктурировать свой код, разделив существующую функциональность на два отдельных класса: Trie
- структура как целое - и TrieNode
- которое содержит ссылки на дочерние TrieNode
s. Trie
будет содержать ссылку на root TrieNode
.
Класс TrieNode
:
class TrieNode
{
/** Initialize your data structure here. */
TrieNode[] links;
final int r = 26;
public boolean isEnd;
public TrieNode()
{
links = new TrieNode[r];
}
public boolean containsKey(char c)
{
return links[c - 'a'] != null;
}
public TrieNode get(char ch)
{
return links[ch - 'a'];
}
public void put(char ch, TrieNode node)
{
links[ch - 'a'] = node;
}
public void setEnd()
{
isEnd = true;
}
public boolean isEnd()
{
return isEnd;
}
}
И класс Trie
:
class Trie
{
TrieNode root;
public Trie()
{
root = new TrieNode();
}
/** Inserts a word into the trie. */
public void insert(String word)
{
TrieNode node = root;
for (int i = 0; i < word.length(); i++)
{
char ch = word.charAt(i);
if (!node.containsKey(ch))
{
node.put(ch, new TrieNode());
}
node = node.get(ch);
}
node.setEnd();
}
/** Returns if the word is in the trie. */
public boolean search(String word)
{
TrieNode node = searchPrefix(word);
// Trie node=null;
return node != null && node.isEnd();
}
public TrieNode searchPrefix(String word)
{
TrieNode node = root;
for (int i = 0; i < word.length(); i++)
{
char ch = word.charAt(i);
if (node.containsKey(ch))
{
node = node.get(ch);
} else
return null;
}
return node;
}
/**
* Returns if there is any word in the trie that starts with the given prefix.
*/
public boolean startsWith(String prefix)
{
TrieNode node = searchPrefix(prefix);
// Trie node=null;
return node != null;
}
}