Как найти слова в матрице букв
Это еще один вопрос, который меня задали в телефонном интервью:
Для словаря и кроссворда (матрица символов 2d) найдите все словарные слова, которые можно найти в кроссворде.
Все, что я мог подумать, было хеш-словарем, найти все возможные слова в кроссворде и искать хэш. Я не мог оптимизировать все это.
Должны признать, что вопросы интервью с Microsoft сложны: (
Пожалуйста, дайте мне строки, о которых нужно подумать.
Ответы
Ответ 1
Как насчет:
- построить дерево поиска для словаря (один уровень для каждой буквы)
- для каждой позиции в сетке, начинайте поиск по индексу, по одному символу за раз и продолжайте движение в каждом разрешенном направлении до тех пор, пока в индексе не останется никаких записей, или вы нажмете границу сетки.
Я не думаю, что хэш был бы очень полезной оптимизацией здесь.
Ответ 2
Наиболее подходящее решение сильно зависит от ограничений, с которыми вы рассчитываете иметь дело. Насколько велик ваш словарь? Насколько велико ваш кроссворд.
Я бы посоветовал взглянуть на деревья суффикса. Вы можете вставить все словарные слова в один. Затем выполните поиск дерева суффиксов для строк, столбцов и диагоналей. Для строк запустите поиск из корня дерева для первой буквы в каждой строке и выполните итерацию по дереву при прохождении строки. Делайте то же самое справа налево, если это необходимо. Аналогичная история для столбцов и диагоналей.
Конструкция дерева - O (N) и потребляет пространство O (N), где N - размер вашего словаря в символах. Затем поиск займет время O (PQ), где кроссворд имеет размер PxQ. Предоставление общего времени выполнения O (N + PQ) и пространства O (N).
Дело в том, что суффиксные деревья - это боль для реализации. Они на самом деле. Таким образом, вы можете предпочесть простую настройку Trie, которая даст вам общее время выполнения O (N + PQ (max (P, Q )).
Ответ 3
Этот вопрос точно так же будет играть Boggle.
Этот предыдущий вопрос в SO более чем достаточно ОТВЕТИТ ЭТОТ ВОПРОС.
Удачи...
Ответ 4
Предположим, что словарь содержит n слов средней длины k, а матрица содержит знаки m2.
- Препроцессор словарь в префиксное дерево (aka trie). - O (kn)
- Для каждой позиции в матрице найдите строки в инете. - O (м³)
Общее время: O (max (kn, m³))
В реалистичных поисковых словах средняя длина слов, найденных в матрице, больше похожа на k, чем на m, поэтому время будет O (k max (n, м²)).
Ответ 5
Что случилось с вашим ответом?
-
Словарь отсортирован, поэтому я считаю, что словаря слова будут переведены в префикс . Это поможет, так как есть много слов, где префикс также является словом. Сортировка помогает (минимально) со временем сборки.
-
Затем пройдите кроссворд, глядя на все возможные слова. Когда вы извлекаете символы потенциального слова, вы идете по три - так что вы найдете первое слово, начинающееся с определенного набора символов, но также и в нужном месте, чтобы продолжать находить другие слова, начинающиеся с того же символы
Ответ 6
Я бы скомпилировал словарь в DFA, который распознавал слова в словаре, а затем запускал его по строкам и столбцам и диагоналям буквенной матрицы. Должно быть O(m+n)
, где m
- длина словаря в символах, а n
- площадь (w * h) матрицы.