Очень сложный вопрос, но я попробую. Это скорее поток сознания, чем ответ, заранее извиняюсь.
Если я правильно понимаю, вам даны две последовательности строк одинакового размера, A и B, проиндексированные, скажем, из 1..n. Затем вам нужно найти последовательность индексов, такую, чтобы конкатенация строк A (1) .. A (m) равнялась конкатенации строк B (1) .. B (m), где m - длина последовательности индексов .
Первое, что я бы заметил, - это то, что может быть бесконечное количество решений. Например, дано:
A {"x", "xx"}
B {"xx", "x"}
Возможные решения:
{1, 2}
{2, 1}
{1, 2, 1, 2}
{1, 2, 2, 1}
{2, 1, 1, 2}
{2, 1, 2, 1}
{1, 2, 1, 2, 1, 2}
...
Так как бы вы узнали, когда остановиться? Как только у вас было одно решение? Как только одно из решений является надмножеством другого решения?
Одним из мест, которое вы могли бы начать, было бы взять все строки минимальной общей длины из обоих наборов (в моем примере выше вы взяли бы «x» из обоих и искать 2 одинаковые строки, имеющие общий индекс). Затем вы можете повторить это для строк следующего размера вверх. Например, если первый набор имеет 3 строки длиной 1, 2 и 3 соответственно, а второй набор имеет строки длины 1, 3 и 3 соответственно, вы должны взять строки длиной 3. Вы будете делать это до тех пор, пока у вас не останется строк. Если вы их найдете, у вас есть решение проблемы.
Тогда становится сложнее, когда вам нужно начать комбинировать несколько строк, как в моем примере выше. Наивный подход грубой силы состоял бы в том, чтобы начать перестановку всех строк из обоих наборов, которые при объединении приводят к строкам одинаковой длины, а затем сравнить их. Итак, в приведенном ниже примере:
A {"ga", "bag", "ac", "a"}
B {"ba", "g", "ag", "gac"}
Вы бы начали с последовательностей длиной 2:
A {"ga", "ac"}, B {"ba", "ag"} (индексы 1, 3)
A {"bag", "a"}, B {"g", "gac"} (индексы 2, 4)
Сравнение этих значений дает "gaac" против "baag" и "baga" против "ggac", которые не равны, поэтому здесь нет решений. Далее мы пойдем на последовательности длиной 3:
A {"ga", "bag", "a"}, B {"ba", "g", "gac"} (индексы 1, 2, 4)
A {"bag", "ac", "a"}, B {"g", "ag", "gac"} (индексы 2, 3, 4)
Опять же, нет решений, поэтому мы в итоге получим последовательности размером 4, из которых у нас нет решений.
Теперь это становится еще сложнее, так как мы должны начать думать о возможном повторении некоторых показателей, и теперь мой мозг тает.
Я думаю, что поиск общих подпоследовательностей в строках может быть полезным, а затем использование оставшихся частей в строках, которые не были сопоставлены. Но я не совсем знаю как.