Если я понимаю вашу проблему, вы хотите найти набор непересекающихся общих подстрок из двух заданных строк, который либо максимизирует общую длину общих подстрок, но и среди них минимизирует количество общих подстрок.Я предложу следующую эвристику: найдите самую длинную общую подстроку (LCS) из двух строк, удалите ее, повторите.Я не могу доказать, что это оптимально, но у меня есть очень эффективный алгоритм для него
Так что в вашем примере AAACDDFFFEE1122VV1VAADD DDFFAA11221DHHVV1VAAFE LCS = VV1VAA
AAACDDFFFEE1122DD DDFFAF121 * 100 *21 * 21 * 211 * 215 * 216 * 211
AAACFEE1122DD AA11221DHHFE
LCS = 1122
AAACFEEDD AADHHFE
и т. Д.
Алгоритм следующий 1) Использовать стандартАлгоритм LCS, основанный на деревьях суффиксов, который равен 1.1, строит деревья суффиксов двух сцепленных строк и с уникальными терминаторами 1.2 помечает каждый узел 1,2 или обоими, в зависимости от того, имеет ли корневое поддерево листья из одной или обеих строк.глубина каждого узла 1.4 найдите строковый самый глубокий узел, который помечен как 1 и 2 2) удалите поддерево, укорененное в этом узле, и обновите метки узлов над ним 3) повторите с 1.4
алгоритм завершаетсякогда в дереве нет узлов, помеченных как 1, так и 2, 1.1 можно сделать в пропорции времениl к сумме длин двух строк 1.2, 1.3 и 1.4 немного больше, чем обходы дерева 2, удаление должно быть постоянным временем, если дерево реализовано правильно, а обновление ограничено длиной LCS 3, сноваобход дерева, но меньшего дерева
Так что это одна оптимизация, чтобы избежать повторных обходов дерева, давайте добавим шаг 1.35: сортировка внутренних узлов, имеющих обе метки, по глубине строки (в отдельной структуре данных дерево все ещетам).Теперь вы можете отсканировать этот отсортированный список узлов, выполнить 2) и повторить.С этой оптимизацией, и если вы можете использовать радикальную сортировку, похоже, что алгоритм представляет собой линейное время, и вы не можете превзойти его в асимптотическом смысле.
Я надеюсь, что это правильно и достаточно ясно, я уверен,вам нужно будет немного ознакомиться с литературой по суффиксам, прежде чем она станет очевидной.Я рекомендую книгу Дэна Гусфилда «Алгоритмы строк, деревьев и последовательностей», в частности, раздел 7.4. Дайте мне знать, если у вас есть вопросы.