Сбалансированная строка - это строка скобок, ()
так что каждая скобка может быть сопоставлена с другой. Более строго они - последовательности, натянутые этой грамматикой:
S → (S)S | ε
Мы можем перевернуть строку "наизнанку":
Переключение всех вхождений
(
и)
друг с другомПеремещение символов от начала строки до конца, пока строка снова не будет сбалансирована.
Давайте сделаем пример.
Начнем со сбалансированной строки:
(()(())())
Затем мы переключаем парены, чтобы сделать
))())(()((
Затем переместите символы от начала строки до конца строки, пока строка не будет сбалансирована.
))())(()((
)())(()(()
())(()(())
))(()(())(
)(()(())()
(()(())())
Вот наш результат!
Обратите внимание, что некоторые строки можно вывернуть наизнанку несколькими способами, например, строку
(()())
Когда вывернута наизнанку может быть:
()(())
или
(())()
Однако каждая строка имеет хотя бы одно решение .
задача
Напишите программу, которая будет принимать сбалансированную строку в качестве входных данных и выводить эту строку наизнанку. В случаях, когда может быть несколько действительных выходов, вам нужно вывести только один из них. Вы можете использовать другой тип распорки ( <>
, []
или {}
) , если вы так хотите.
Это соревнование по коду-гольфу, поэтому вы должны стремиться минимизировать размер исходного кода, измеряемый байтами.
Тестовые случаи
(()()) -> ()(()), (())()
(()(())()) -> (()(())())
((())())() -> (()(()()))