Если вас не волнует память и вы можете позволить себе предварительно обработать список, создайте отсортированный массив каждого суффикса, указывающего на оригинальное слово, например, для ['hello', 'world'], store это:
[('d' , 'world'),
('ello' , 'hello'),
('hello', 'hello'),
('ld' , 'world'),
('llo' , 'hello'),
('lo' , 'hello'),
('o' , 'hello'),
('orld' , 'world'),
('rld' , 'world'),
('world', 'world')]
Используйте этот массив для построения наборов подходящих совпадений с использованием фрагментов шаблона.
Например, если шаблон *or*
, найдите подходящее совпадение ('orld' , 'world')
, используя двоичную отбивку на подстроке or
, затем подтвердите совпадение, используя нормальный подход с глобализацией.
Если подстановочный знак является более сложным, например, h*o
, создайте наборы кандидатов для h
и o
и найдите их пересечение перед последним линейным шаром.