Наиболее подходящее решение во многом зависит от ограничений, с которыми вы ожидаете иметь дело.Насколько велик ваш словарь?Насколько велик ваш кроссворд.
Я бы посоветовал взглянуть на Суффикс-деревья .Вы можете вставить все слова словаря в одно.Затем найдите в дереве суффиксов строки, столбцы и диагонали.Для строк, начните поиск с корня дерева для первой буквы в каждой строке и итерируйте по дереву, когда вы проходите через строку.Сделайте то же самое справа налево, если необходимо.Аналогичная история для столбцов и диагоналей.
Конструкция дерева - это O (N) и занимает O (N) место, где N - размер вашего словаря в символах.Поиск займет время O (PQ), когда ваш кроссворд имеет размер PxQ.Предоставление общего времени выполнения O (N + PQ) и пространства O (N).
Дело в том, что деревья с суффиксами - трудная задача для реализации.Они действительно есть.Поэтому вы можете предпочесть простой Trie , который даст вам общее время выполнения O (N + PQ (max (P, Q)).