В вашем примере круглые скобки в строке не сбалансированы, и из определения вашего алгоритма не совсем понятно, как их следует обрабатывать. Если мы предположим, что входные данные на самом деле хорошо сбалансированы, то ваша собственная структура данных будет представлять собой дерево с ветвями, представляющими один уровень скобок, а листьями - «слова». Тогда алгоритм, который вам нужен, это простая конструкция на основе стека. В следующем примере я использую явный стек, но вы можете переписать алгоритм, чтобы он был рекурсивным, и тогда стек будет неявным.
// Tree structure definition
sealed trait Data
object Data {
case class Leaf(data: String) extends Data
case class Branch(parts: Vector[Data]) extends Data {
// a convenience method to append data to a branch more easily
def :+(data: Data): Branch = copy(parts = parts :+ data)
}
}
object Main extends App {
val regexPattern = "((?<=\\()|(?=\\())|((?<=\\))|(?=\\)))"
val string = "ab(cde(fgh)ijk)lmn" // now the input is balanced
val data: Vector[String] = string.split(regexPattern).toVector
println(data)
var stack: List[Data.Branch] = Data.Branch(Vector.empty) :: Nil
for (part <- data) {
part match {
case "(" =>
stack = Data.Branch(Vector.empty) :: stack
case ")" =>
val top :: parent :: rest = stack
stack = (parent :+ top) :: rest
case _ =>
stack = (stack.head :+ Data.Leaf(part)) :: stack.tail
}
}
val result = stack.head
println(result)
}
Это выводит это:
Vector(ab, (, cde, (, fgh, ), ijk, ), lmn)
Branch(Vector(Leaf(ab), Branch(Vector(Leaf(cde), Branch(Vector(Leaf(fgh))), Leaf(ijk))), Leaf(lmn)))
Если мы немного переформатируем, мы получим
Branch(Vector(
Leaf(ab),
Branch(Vector(
Leaf(cde),
Branch(Vector(
Leaf(fgh)
)),
Leaf(ijk)
)),
Leaf(lmn)
))
, который, как вы можете видеть, отражает структуру внутри вашей строки.
Если ваш ввод может иметь несбалансированные скобки, то вам может понадобиться добавить дополнительные проверки в цикл в части case ")"
. Прямо сейчас, если вход не сбалансирован, будет выдан MatchError
, потому что переменная stack
не будет иметь необходимого количества элементов.