Префикс результатов поиска с использованием структуры данных Trie в Java
Я застрял в этой проблеме с задачей получения результата с префиксом, так как строка, введенная до сих пор, отображается после того, как пользователь вводит каждый символ. Прикрепленный код работает нормально с большинством тестовых случаев, но я не могу обнаружить ошибку в коде для нескольких тестовых случаев. Например:
Рассмотрим приведенный ниже тестовый пример, содержащий номер тестового примера, номер проверяемой строки и все строки.
1 14 saneadeb sanadcbabdcb sanbcaccd sanbded sanccdcdbd sancdcbeceaa sanadcadeee saneabddabcdea sanbaeecdecab sanbbeeaaa saneab sanaccccbcbedce sanbabdbaecba санка
Ожидаемый результат
sanaccccbcbedce sanadcadeee sanadcbabdcb sanbabdbaecba sanbaeecdecab sanbbeeaaa sanbcaccd sanbded санка a sanccdcdbd sancdcbeceaa saneab saneabddabcdea saneadeb
Но вывод кода ниже:
sanaccccbcbedce sanadcadeee sanadcbabdcb sanbabdbaecba sanbaeecdecab sanbbeeaaa sanbcaccd sanbded санка a sanccdcdbd sancdcbeceaa saneab saneadeb
один результат (saneabddabcdea) отсутствует в ожидаемом результате.
код можно найти по адресу: https://ide.geeksforgeeks.org/1NLzVGykoL
import java.util.*;
import java.lang.*;
import java.io.*;
class TrieNode {
int size = 26;
public TrieNode[] children = new TrieNode[size];
public boolean isLeaf;
TrieNode() {
isLeaf = false;
for (int i = 0; i < size; i++) {
children[i] = null;
}
}
}
class Trie {
TrieNode root = new TrieNode();
public void insert(String key) {
int level;
int length = key.length();
int index;
TrieNode ptr = root;
for (level = 0; level < length; level++) {
index = key.charAt(level) - 'a';
if (ptr.children[index] == null) {
ptr.children[index] = new TrieNode();
}
ptr = ptr.children[index];
}
ptr.isLeaf = true;
}
public TrieNode search(String key) {
int level;
int length = key.length();
int index;
TrieNode pointer = root;
for (level = 0; level < length; level++) {
index = key.charAt(level) - 'a';
if (pointer.children[index] == null) {
return pointer.children[index];
}
pointer = pointer.children[index];
}
if (pointer.isLeaf == true && pointer != null) {
return pointer;
}
return pointer;
}
static String getStringRepresentation(ArrayList < Character > list) {
StringBuilder builder = new StringBuilder(list.size());
for (Character ch: list) {
builder.append(ch);
}
return builder.toString();
}
static ArrayList < String > result = new ArrayList < String > ();
public void clearResult() {
result.clear();
}
static ArrayList < String > findAllNames(TrieNode current, String key) {
int index;
ArrayList < Character > arr = new ArrayList < Character > ();
if (current.isLeaf == false) {
for (int i = 0; i < key.length(); i++) {
arr.add(key.charAt(i));
}
for (int j = 0; j < 26; j++) {
if (current.children[j] != null) {
char toAdd = (char)(97 + j);
arr.add(toAdd);
String str = getStringRepresentation(arr);
// System.out.println(str);
findAllNames(current.children[j], str);
arr.remove(arr.size() - 1);
}
}
} else {
result.add(key);
}
return result;
}
public ArrayList < String > searchByPrefix(TrieNode pointer, String prefix) {
return findAllNames(pointer, prefix);
}
}
class GFG {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int testCases = scan.nextInt();
int input = 0;
while (input < testCases) {
int noOfWords = scan.nextInt();
Trie trie = new Trie();
for (int i = 0; i < noOfWords; i++) {
trie.insert(scan.next());
}
String toFind = scan.next();
for (int i = 0; i < toFind.toCharArray().length; i++) {
String finding = toFind.substring(0, i + 1);
if (trie.search(finding) != null) {
TrieNode ptr = trie.search(finding);
ArrayList < String > list = trie.searchByPrefix(ptr, finding);
for (String object: list) {
System.out.print(object);
System.out.print(" ");
}
trie.clearResult();
System.out.println("");
} else {
System.out.println("0");
}
}
input++;
}
}
}