You are given a string and an array of strings. How to quickly check, if this string can be built by concatenating some of the strings in the array?
This is a theoretical question, I don't need it for practical reasons. But I would like to know, if there is some good algorithm for this.
EDIT Reading some answer I have noticed, that this is probably NP-Complete problem. Even finding a subset of strings, that will together have same length, as a given string is a classic subset sum problem.
So I guess there is no easy answer to this.
EDIT
Now it seems, that it is not a NP-Complete problem after all. That's way cooler :-)
EDIT
I have came up with a solution that passes some tests:
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
I believe the time is O(n * m^3), where n is length of substrings and m is length of string. What do you think?