Недавно я делал что-то подобное, и мне потребовалось много времени, чтобы решить эту проблему, так что вот как я это делаю.Для этого может быть более простой алгоритм.
Вы можете написать анализатор рекурсивного спуска, чтобы преобразовать текст в дерево.Сделайте узлы листа строк, которые содержат эту строку и соответствующую пару фигурных скобок, внутренним узлом.Каждый листовой узел может содержать более одной строки.
Например, это:
/a/{b,c}/{d,e{f,g,h}}/i
может стать:
(
["/a/"]
{
( ["b"] )
( ["c"] )
}
["/"]
{
( ["d"] )
(
["e"]
{
( ["f"] )
( ["g"] )
( ["h"] )
}
)
}
["i"]
)
Попробуйте рассматривать его как деревогде ["stringA", "stringB"]
обозначает листовой узел, а соответствующая пара фигурных скобок представляет внутренний узел.Существует 2 типа внутреннего узла, один из которых может выбирать между одной из альтернатив (я использую {}
в этом примере) и один, который объединяет все комбинации (здесь я использую ()
).
Итаквышеприведенное дерево будет выглядеть так:
(
["/a/"]
{
["b"]
["c"]
}
["/"]
{
["d"]
(
["e"]
{
["f"]
["g"]
["h"]
}
)
}
["i"]
)
, затем
(
["/a/"]
["b", "c"]
["/"]
{
["d"]
(
["e"]
["f", "g", "h"]
)
}
["i"]
)
, затем
(
["/a/"]
["b", "c"]
["/"]
{
["d"]
["ef", "eg", "eh"]
}
["i"]
)
, затем
(
["/a/"]
["b", "c"]
["/"]
["d", "ef", "eg", "eh"]
["i"]
)
и, наконец,у вас получится один листовой узел, представляющий собой все комбинации:
["/a/b/di", "/a/b/efi", "/a/b/egi", "/a/b/ehi",
"/a/c/di", "/a/c/efi", "/a/c/egi", "/a/c/ehi"]
Тогда вы можете довольно просто распечатать его.