Дан массив строк 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]; LinkedListsuggestion = 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”