Префикс результатов поиска с использованием структуры данных 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++;
        }
    }
}

0 ответов

Другие вопросы по тегам