#ruby #combinations
#ruby #комбинации
Вопрос:
Как я могу найти все возможные комбинации набора строк в данной строке?
strings = ["ab","aa","ab","bb","ba","aba","aab"]
given_string = "abaababbab"
должен возвращать:
[
["ab","aa","ba","bb","ab],
["ab","aab","ab","ba","bab"]
["aba","aba","bb","ab"]
]
Комментарии:
1. Вы имеете в виду все комбинации символов (например, «abc» вернет «abc», «acb», bac», «bca», cba»), вы имеете в виду все конкатенации всех строк (например, [«dog», «cat»] возвращает [«dogcat», «catdog»], или все комбинации всех символов и все конкатенации?
2. как это может быть «bab» в вашем возврате, если
strings
не включает «bab»?3. Похоже, что это вызывает рекурсивную функцию (прошу прощения, если вы уже зашли так далеко). Приветствия!
Ответ №1:
Приблизительная идея может быть примерно такой:
strings.select do |s|
given_string.index(s)
end
Это дало бы вам:
["ab", "aa", "ab", "bb", "ba", "aba", "aab"]
Я не уверен, ищете ли вы здесь дубликаты или нет. Вы можете столкнуться с вычислительно сложной проблемой, если не будете осторожны, поскольку именно такого рода вещи делают секвенирование ДНК чрезвычайно трудоемким с точки зрения вычислений.
Ответ №2:
Следующее:
strings = ["ab","aa","ab","bb","ba","aba","aab"]
@strings = strings.uniq!
@given_string = 'abaababbab'
@given_length = @given_string.length
def parse
@parses.each do |parse|
before = parse.pop # offset of the part that hasn't yet been parsed
@strings.each do |str|
next unless m = @given_string.match(str, before)
first, last = m.offset(0)
next unless first == before
if last == @given_length
@completed_parses.push([*parse, str])
else
@new_parses.push([*parse, str, last])
end
end
end
@parses = @new_parses
@new_parses = []
parse unless @parses.empty?
end
@parses = [[0]]
@new_parses = []
@completed_parses = []
parse
p @completed_parses
даст вам:
[["aba", "aba", "bb", "ab"], ["ab", "aa", "ba", "bb", "ab"]]
Я не понимаю, почему у вас есть ["ab","aab","ab","ba","bab"]
в вашем ответе.