akass: вот уж точно нетривиальная задача) в целом все правильно, но передавать исходный geni будет неудобно, я бы создал из него (без элемента gen конечно - он уже есть в gen) новый список типа List и потом из него удалял элементы - RemoveAt, а в целом все правильно.
Еще тут нет того что происходит в самой функции Assembly.
akass: тогда все так как я и описал, простым перебором, просто в задаче по всей видимости не будет даваться слишком большое число фрагментов.
Самый простой способ реализации через рекурсию, алгоритм примерной такой:
для каждого фрагмента (мы ведь не знаем какой из них первый) вызываем рекурсивную функцию с параметрами
string Функция (текущий фрагмент, массив остальных фрагментов){
для каждого из массива фрагментов ищем фрагмент "подходящий", тут просто поиск подстроки и замена
если таковой найден "прикрепляем" к текущему фрагменту, из массива удаляем, вызываем функцию еще раз передаем новый текущий фрагмент и новый массив (без удаленного фрагмента)
Если таковых больше чем 1 проделываем описанное выше для каждого фрагмента,
если подходящих фрагментов в массиве нет выходим и возвращаем "не подходит"
если массив пуст значит мы нашли 1 из возможных исходных последовательностей, возвращаем ее
}
таким образом получается 1 цикл (по всем начальное заданным фрагментам) и "епическое" количество рекурсивных цепочек (зависит от числа фрагментов изначально), большая часть которых отвалится еще в начале цепочки, поэтому операций выйдет меньше чем тупой перебор на порядок.
вообще задачка простая, но интересная, если не секрет откуда задача?
Еще тут нет того что происходит в самой функции Assembly.