Вы можете использовать backtracking. Вот некоторый псевдо-код:
def generateSolutions(unusedWords, usedWords, string, position):
if position == string.length():
print(usedWords)
else:
for word in unusedWords:
if word is a prefix of string[position ... s.length() - 1]:
generateSolutions(unusedWords - word, usedWords + word,
string, position + word.length())
generateSolution(words, an empty list, input string, 0)
Идея очень проста: мы можем просто выбрать неиспользуемое слово, которое соответствует префиксу остальной части строки ввода и сохранить генерируя все допустимые комбинации рекурсивно (я предполагаю, что мы можем используйте каждое слово из данного списка слов только один раз). Это решение имеет экспоненциальную временную сложность, но в худшем случае невозможно сделать намного лучше. Например, если заданная строка равна abcdef...yz
, а список слов - [a, b, c, ..., z, ab, cd, ..., yz]
, то число таких комбинаций равно 2^n/2
, где n
- длина данной строки.
Может быть, у вас есть [префиксное дерево] (http://en.wikipedia.org/wiki/Trie) элементов A. Тогда вы можете определить слова, которые являются префиксом строки немного быстрее. – Kevin
@Kevin: как я могу интегрировать дерево префикса в это решение? – user199
@ user199 Когда нам нужно найти, является ли слово префиксом строки [position ...], мы можем пересечь дерево префикса вместо повторения всех слов. – kraskevich