Проблема:
По заданному списку строк найдите подстроку, которая, если вычесть из начала всех строк, где она совпадает, и заменить ее на escape-байт, дает самую короткую общую длину.
Пример:
"foo"
, "fool"
, "bar"
Результат: "foo" в качестве базовой строки со строками "\0"
, "\0l"
, "bar"
и общей длиной 9 байтов. "\0"
- это управляющий байт. Сумма длины исходных строк равна 10, поэтому в этом случае мы сохранили только один байт.
Наивный алгоритм будет выглядеть так:
for string in list
for i = 1, i < length of string
calculate total length based on prefix of string[0..i]
if better than last best, save it
return the best prefix
Это даст нам ответ, но это что-то вроде O ((n * m) ^ 2), что слишком дорого.