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