Как слить все строковые триплеты?

Правка ru1, от egor.okhterov, 2016-12-03 17:08:48

Мы порождаем все триплеты используя алфавит из 26 английских букв (A = {a, b, c, ..., z}):
A3 = A × A × A = 
{
  (a, a, a), 
  (a, a, b), 
  (a, a, c), 
    ..., 
  (a, a, z), 
  (b, a, a), 
    ..., 
  (z, z, y), 
  (z, z, z), 
}

|A3| = 263 = 17576

  • Если мы попытаемся слить триплеты aaa и bbb, то нам придётся прикрепить bbb к концу строки aaa, так как они не перекрываются:
    merge(aaa, bbb) = aaabbb

  • Но если мы сливаем строку aaa со строкой aab, то мы получим результат меньшей длины:
    merge(aaa, aab) = aaab

В лучшем случае, если нам получится всегда делать слияния второго типа, то для каждого триплета (кроме первого) мы будем просто удлинять результирующую строку на 1 символ. Всего у нас есть 17576 триплетов, так что мы добавим к результирующей строке 17575 символов. В результате этих добавлений, финальная строка, содержащая все возможные триплеты будет иметь длину 17575 + 3 = 17578.

В худшем случае мы всегда будем делать операцию слияния первого типа, что приведёт к результирующей строке длины 17576 * 3 = 52728.

Лучший результат находится где-то в интервале [17578, 52728].

Как же нам скомбинировать все триплеты, чтобы получить строку минимальной длины?

Теги strings, string problem, граф де брёйна

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
ru3 Русский egor.okhterov 2016-12-03 18:40:02 135 Мелкая правка: '*\n\n---\n![ ](htt' -
en4 Английский egor.okhterov 2016-12-03 18:36:17 117 Tiny change: ' length?**' -
en3 Английский egor.okhterov 2016-12-03 17:47:10 6 Tiny change: '-grams of smaller case le' -> '-grams of lower case le'
ru2 Русский egor.okhterov 2016-12-03 17:10:40 2 (опубликовано)
ru1 Русский egor.okhterov 2016-12-03 17:08:48 1380 Первая редакция перевода на Русский (сохранено в черновиках)
en2 Английский egor.okhterov 2016-12-03 15:28:51 948 Tiny change: 'e letters:\n$A_3 = $' - (published)
en1 Английский egor.okhterov 2016-12-03 15:05:57 182 Initial revision (saved to drafts)