Пусть длина вашего сжатого документа равна N.
Пусть b (n) будет логическим: true, если документ можно разбить на слова, начиная с позиции n в документе.
b (N) - истина (поскольку пустая строка может быть разбита на 0 слов).Учитывая b (N), b (N - 1), ... b (N - k), вы можете построить b (N - k - 1), рассматривая все слова, начинающиеся с символа N - k - 1. Если естьлюбое такое слово, w, с установленным b (N - k - 1 + len (w)), затем установите b (N - k - 1) в true.Если такого слова нет, тогда установите b (N - k - 1) в false.
В конце концов, вы вычисляете b (0), который сообщает вам, можно ли разбить весь документ на слова.
В псевдокоде:
def try_to_split(doc):
N = len(doc)
b = [False] * (N + 1)
b[N] = True
for i in range(N - 1, -1, -1):
for word starting at position i:
if b[i + len(word)]:
b[i] = True
break
return b
Есть несколько приемов, которые вы можете сделать, чтобы получить «слово, начинающееся с позиции i», но вас попросили использовать алгоритм O (N ^ 2), так что выможно просто посмотреть каждую строку, начинающуюся с i, в словаре.
Чтобы сгенерировать слова, вы можете либо изменить приведенный выше алгоритм для сохранения хороших слов, либо просто сгенерировать его следующим образом:
def generate_words(doc, b, idx=0):
length = 1
while true:
assert b(idx)
if idx == len(doc): return
word = doc[idx: idx + length]
if word in dictionary and b(idx + length):
output(word)
idx += length
length = 1
Здесь b - логический массив, сгенерированный из первой части алгоритма.