Я думаю, что множество всех строк, которые встречаются как конкатенация допустимых слов (слов, взятых из конечного словаря), образуют обычный язык над алфавитом символов. Затем вы можете построить конечный автомат, который принимает именно те строки, которые вы хотите; время вычисления O (n).
Например, пусть словарь состоит из слов {bat, bag}. Затем мы строим следующий автомат: состояния обозначаются 0, 1, 2. Края: (0,1, b), (1,2, a), (2,0, t), (2,0, g) ; где тройка (x, y, z) означает ребро, ведущее от x к y на входе z. Единственное принимающее состояние - 0. На каждом шаге при чтении следующего входного знака вы должны вычислить набор состояний, которые достижимы на этом входном сигнале. Учитывая, что число состояний в автомате постоянно, оно имеет сложность O (n). Что касается сложности пространства, я думаю, что вы можете сделать с O (количество слов) с подсказкой для конструкции выше.
В другом примере со словами {bag, bat, bun, но} автомат будет выглядеть так:
Предположим, что автомат уже построен (время, чтобы сделать это, как-то связано с длиной и количеством слов :-), теперь мы утверждаем, что время, чтобы решить, будет ли строка принята автоматом, равно O ( n) где n - длина входной строки.
Более формально наш алгоритм выглядит следующим образом:
- Пусть S - набор состояний, изначально содержащий начальное состояние.
- Прочитайте следующий вводимый символ, обозначим его как.
- Для каждого элемента s в S определите состояние, в которое мы переходим из s при чтении a; то есть состояние r такое, что с обозначениями выше (s, r, a) является ребром. Обозначим множество этих состояний через R. То есть R = {r | s в S, (s, r, a) - ребро}.
- (Если R пусто, строка не принимается и алгоритм останавливается.)
- Если входных символов больше нет, проверьте, находится ли какое-либо из принимающих состояний в R. (В нашем случае, есть только одно принимающее состояние, начальное состояние.) Если это так, строка принимается, если нет, строка не принята.
- В противном случае возьмите S: = R и перейдите к 2.
Теперь количество выполнений этого цикла равно количеству входных символов. Единственное, что мы должны исследовать, это то, что шаги 3 и 5 занимают постоянное время. Учитывая, что размер S и R не превышает число состояний в автомате, которое является постоянным, и что мы можем хранить ребра таким образом, чтобы время поиска было постоянным, это следует. (Обратите внимание, что мы, конечно, теряем несколько «разборов», но это также не было требованием.)
Я думаю, что это на самом деле называется проблемой членства для обычных языков, но я не смог найти подходящую онлайн-справку.