Рубрики
Без рубрики

Код 1268 : Система Предложений по Поиску (Подход Trie)

Вопрос: Дан массив строк products и строковое поисковое слово. Мы хотим спроектировать… С тегами java, программирование, информатика, алгоритмы.

Дан массив строк products и строковое поисковое слово. Мы хотим разработать систему, которая предлагает не более трех названий продуктов из продуктов после ввода каждого символа поискового слова. Предлагаемые товары должны иметь общий префикс с поисковым словом. Если существует более трех продуктов с общим префиксом, верните три лексикографически минимальных продукта.

Возвращает список списков предлагаемых товаров после ввода каждого символа поискового слова.

Пример 1:

Входные данные: продукты = [“мобильный”,”мышь”, “денежный ящик”,”монитор”, “коврик для мыши”], Вывод: [ [“мобильный”, “денежный ящик”, “монитор”], [“мобильный”, “денежный ящик”, “монитор”], [“мышь”, “коврик для мыши”], [“мышь”, “коврик для мыши”], [“мышь”, “коврик для мыши”] ] Объяснение: товары отсортированы лексикографически = [“мобильный”, “денежный ящик”, “монитор”, “мышь”, “коврик для мыши”] После ввода m и mo все продукты совпадают, и мы показываем пользователя [“мобильный”, “денежный ящик”, “монитор”] После ввода my, mous и mouse система предложит [“мышь”, “коврик для мыши”]

Пример 2:

Входные данные: продукты = [“гавана”], Вывод: [[“гавана”], [“гавана”], [“гавана”], [“гавана”], [“гавана”], [“гавана”]]

Пример 3:

Ввод: продукты = [“сумки”, “багаж”,”баннер”,”коробка”, “ткани”], Вывод: [[“багаж”, “сумки”, “баннер”],[“багаж”, “сумки”, “баннер”],[“багаж”, “сумки”],[“сумки”]]

Пример 4:

Входные данные: продукты = [“гавана”], Вывод: [[],[],[],[],[],[],[]]

  • [“гавана”], Вывод: [[],[],[],[],[],[],[]]
  • В продуктах нет повторяющихся элементов.
  • 1 продукты[i].длина * 10^4
  • Все символы продуктов[i] являются строчными английскими буквами.
  • Все символы продуктов[i] являются строчными английскими буквами.
  • Все символы поискового слова – это строчные английские буквы.

Подход:

К этому вопросу можно подойти, используя структуру данных Trie. Здесь нам нужно позаботиться о префиксе, и найти префикс довольно просто, когда мы используем структуру данных Trie. В нашей структуре данных trie у нас будет массив Treenode размером 26, а также связанный список строк, чтобы сохранить 3 лучших предложения в соответствии с нашим вопросом.

Таким образом, древовидная структура будет:

class TrieNode {
    TrieNode [] child = new TrieNode [26];
    LinkedList suggestion = new LinkedList<>();
}

Вставить

Мы знаем, у нас есть некоторые базовые операции, такие как вставка, поиск и т.д., И следуйте этому сообщению, чтобы получить общее представление о том, как мы вставляем.

Структура данных Trie – Операция Вставки

Рохит V ・ 9 мая ・ 4 минуты чтения

Здесь мы делаем трюк, который заключается в том, что мы добавим слова в связанный список предложений, и поскольку нам нужно всего 3 слова в качестве предложения, мы удаляем последнее слово, если размер связанного списка превышает 3.

public void insert(String word) {
        TrieNode node = root;
        for (char ch : word.toCharArray()){
            int index = ch - 'a';
            if (node.child[index] == null) {
                node.child[index] = new TrieNode();
            }
            node = node.child[index];
            node.suggestion.offer(word);
            if (node.suggestion.size() > 3) {
                node.suggestion.pollLast();
            }
        }
    }

Здесь всякий раз, когда нажимается определенный символ, создается новый узел, если он отсутствует, и добавляется это слово в качестве предложения в связанный список.

Итак, после вставки слов у нас будет такая структура, как эта:

Теперь все довольно просто, мы проходим по каждому символу внутри поискового слова , ищем соответствующий узел этого символа и добавляем предложение к результату. Если у символа нет ни одного узла в нашем дереве, то мы добавляем пустое значение в наш результат.

  public List> search(String searchWord) {
        List> result = new ArrayList<>();
        TrieNode node = root;
        for (char ch : searchWord.toCharArray()) {
            int index = ch - 'a';
            if (node != null) {
                node = node.child[index];
            }
            result.add(node == null ? Arrays.asList() : node.suggestion);
        }
        return result;
    }
class Solution {

    private TrieNode root = new TrieNode();

    public void insert(String word) {
        TrieNode node = root;
        for (char ch : word.toCharArray()){
            int index = ch - 'a';
            if (node.child[index] == null) {
                node.child[index] = new TrieNode();
            }
            node = node.child[index];
            node.suggestion.offer(word);
            if (node.suggestion.size() > 3) {
                node.suggestion.pollLast();
            }
        }
    }

    public List> search(String searchWord) {
        List> result = new ArrayList<>();
        TrieNode node = root;
        for (char ch : searchWord.toCharArray()) {
            int index = ch - 'a';
            if (node != null) {
                node = node.child[index];
            }
            result.add(node == null ? Arrays.asList() : node.suggestion);
        }
        return result;
    }


    public List> suggestedProducts(String[] products, String searchWord) {
        Arrays.sort(products);
        for (String product : products) {
            insert(product);
        }
        return search(searchWord);
    }
}

class TrieNode {
    TrieNode [] child = new TrieNode [26];
    LinkedList suggestion = new LinkedList<>();
}

Сложность зависит от процесса построения True и длины поискового слова. Построение истинного времени затрат O (m * m * n) из-за использования строки сравнения, которая требует времени O (m) для каждого сравнения. Следовательно, Время: O(m * m * n + L), пространство: O(m * n + L * m) – включая возвращаемый список ans, где длина продуктов,.length,.length().

Rohithv07/Почтовый индекс

Проблемы с LeetCode, которые решены.

Проблемы с LeetCode, которые решены.

Оригинал: “https://dev.to/rohithv07/leetcode-1268-search-suggestions-system-trie-approach-42p7”