Существует ли существует подмножество подстроек для восстановления другой строки?

cs.stackexchange https://cs.stackexchange.com/questions/117765

  •  28-09-2020
  •  | 
  •  

Вопрос

Я ищу высокопроизводительный алгоритм производительности для проверки, можете ли я реконструировать данную строку с использованием данного набора подстроек. Подробнее:

Давайте скажем, наши строки по поводу алфавита $ \ sigma $ .

<Сильные> входы :

    .
  • строка $ s \ in \ sigma ^ * $
  • Конечный набор строк $ a={a_1, a_2, ..., a_n \} \ subset \ sigma ^ * $ .

<Сильный> Выход :

    .
  • $ \ существует m: \ существует b_1, b_2, \ ldots, b_m \ in: b_1 + b_2 + \ cdots + b_m= s $

Где $ + $ - это строковое конкатенация.

Например, если $ S= {} $ " $ ABCD $ " и <класс SPAN= «Математический контейнер»> $ a={$ " $ ab $ " $, $ < / span> " $ CD $ " $, $ " $ AC $ " $ \} $ , ответ верно. Для целей этого вопроса предположим, что строки в $ a $ могут быть использованы несколько раз, если это необходимо.

Это было полезно?

Решение

Если при использовании строк повторного использования в $ A $ разрешено вы можете решить ее с динамическим программированием: во-первых, хранить строки в $ $ в дереве префикса (просто обратная суффикс дерево Ссылка ) Рекурсивно детокмин, если $ s [I: End] $ может быть построен из $ a $ : пусть $ \ ell $ Будьте длиной строки, а WLOG предполагают $ S $ «Математический контейнер»> $ \ $$ и $ A \ Получает \ Cup \ {\ $ \} $ . Moroever, пусть $ m [i] \ in \ {0,1 \} $ Укажите, если $ S [I: \ ell] $ может быть построен элементами в $ a $ . Инициализировать $ m [i] \ получает \ infty $ для $ i= 0, \ dots, \ Ell-1 $ < / span> и $ m [\ ell]= 1 $ (потому что $ s [\ ell]=$$ / span>). Теперь предположим, что $ f (i) $ - это функция, которая рекурсивно вычисляет $ m [i] $ если Это уже не было вычислено. Когда $ f (i) $ вызывается, начать с корня суффиксного дерева $ a $ и Traverse $ s [i], s [i + 1], \ dots $ на дереве суффикса до указания $ J $ , такой, что соответствующий узел находится в $ a $ , и рекурсивно вызов $ f (j) $ . Если возвращает $ 1 $ , установите $ m [i]= 1 $ и return $ 1 $ . В противном случае повторите процесс с обходом $ s [j + 1], s [j + 2], \ dots $ До другого участника в $ a $ , или лист достигнут. Если бы не было успеха, установите $ m [i]= 0 $ и return $ 0 $ . Чтобы решить проблему, вызовите $ f (1) $ . Ухудшая сложность Case - это сложность - $ \ Ell d $ , с $ d $ Быть глубиной Дерево суффикса (самая длинная последовательность в $ A $ ), а также стоимость строительства дерева префикса.

Сценарий наихудшего случая во многих случаях будет избегать, потому что поиск рекурсивного вызова останавливается, как только будет найдено одно решение. Таким образом, на практике, часть $ \ Ell D $ Part может быть намного меньше. Строительство суффиксного дерева может быть дорогостоящим в зависимости от $ a $ . Но если $ a $ используется для нескольких строк $ S $ , стоимость амортизация. Если $ a $ действительно большой и $ s $ коротко, может быть лучше просто сортировать элементы $ a $ и сделать двоичный поиск вместо обхода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с cs.stackexchange
scroll top