Вы можете начать с одной из строк в списке (сохраненных как string
) и для каждой из оставшихся строк в списке (сохраненных как candidate
), где:
candidate
является частью string
, candidate
, содержит string
, candidate
, соответствует хвосту string
, - или,
candidate
голова совпадает с хвостом string
,
собрать две строки в соответствии с их перекрытием, а затем рекурсивно повторить процедуру с удалением перекрывающей строки из оставшихся строки собранная строка добавляется до тех пор, пока в списке не останется только одна строка, и в этот момент она является действительной полностью собранной строкой, которую можно добавить к окончательному выводу.
Поскольку потенциально может быть несколько способов несколькостроки могут накладываться друг на друга, некоторые из которых могут привести к одинаковым собранным строкам, вместо этого вы должны сделать вывод набора строк:
def assemble(str_list, min=3, max=15):
if len(str_list) < 2:
return set(str_list)
output = set()
string = str_list.pop()
for i, candidate in enumerate(str_list):
matches = set()
if candidate in string:
matches.add(string)
elif string in candidate:
matches.add(candidate)
for n in range(min, max + 1):
if candidate[:n] == string[-n:]:
matches.add(string + candidate[n:])
if candidate[-n:] == string[:n]:
matches.add(candidate[:-n] + string)
for match in matches:
output.update(assemble(str_list[:i] + str_list[i + 1:] + [match]))
return output
, чтобы при вводе образца:
StrList1 = ['d+%7B%0A++++public+', 'public+static+v','program%0Apublic+', 'ublic+class+Hel', 'lass+HelloWorld', 'elloWorld+%7B%0A+++', '%2F%2F+Sample+progr', 'program%0Apublic+']
assemble(StrList1)
would return:
{'%2F%2F+Sample+program%0Apublic+class+HelloWorld+%7B%0A++++public+static+v'}
или как пример ввода с различными перекрывающимися возможностями (что вторая строка может соответствовать первой, находясь внутри, имея хвост, совпадающий с головой, и имея голову, совпадающую с хвостом):
assemble(['abcggggabcgggg', 'ggggabc'])
вернется:
{'abcggggabcgggg', 'abcggggabcggggabc', 'abcggggabcgggggabc', 'ggggabcggggabcgggg'}