Вам предоставляется строка и массив строк. Как быстро проверить, может ли эта строка быть построена путем конкатенации некоторых строк в массиве?
Это теоретический вопрос, мне он не нужен по практическим соображениям. Но я хотел бы знать, если для этого есть хороший алгоритм.
ИЗМЕНИТЬ Читая какой-то ответ, я заметил, что это, вероятно, проблема NP-Complete. Даже найти подмножество строк, которые будут иметь одинаковую длину, так как заданная строка является классической проблемой суммы подмножества.
Итак, я думаю, что на этот вопрос нет простого ответа.
ИЗМЕНИТЬ
Теперь кажется, что это не проблема NP-Complete. Таким образом, кулер: -)
ИЗМЕНИТЬ
Я придумал решение, которое проходит некоторые тесты:
def can_build_from_substrings(string, substrings):
prefixes = [True] + [False] * (len(string) - 1)
while True:
old = list(prefixes)
for s in substrings:
for index, is_set in enumerate(prefixes):
if is_set and string[index:].startswith(s):
if string[index:] == s:
return True
prefixes[index + len(s)] = True
if old == prefixes: # nothing has changed in this iteration
return False
Я считаю, что время O(n * m^3)
, где n
- длина substrings
, а m
- длина string
. Как вы думаете?