Chuỗi cân bằng là một chuỗi các dấu ngoặc đơn ()
để mọi dấu ngoặc đơn có thể được khớp với một chuỗi khác. Nghiêm khắc hơn, chúng là các chuỗi được kéo dài bởi ngữ pháp này:
S → (S)S | ε
Chúng ta có thể biến một chuỗi "từ trong ra ngoài" bằng cách:
Chuyển đổi tất cả các lần xuất hiện
(
và)
với nhauDi chuyển các ký tự từ phía trước của chuỗi sang phía sau cho đến khi chuỗi được cân bằng lại.
Hãy làm một ví dụ.
Chúng tôi bắt đầu với chuỗi cân bằng:
(()(())())
Sau đó chúng tôi chuyển đổi parens để thực hiện
))())(()((
Sau đó di chuyển các ký tự từ phía trước chuỗi sang phía sau chuỗi cho đến khi chuỗi được cân bằng.
))())(()((
)())(()(()
())(()(())
))(()(())(
)(()(())()
(()(())())
Đó là kết quả của chúng tôi!
Lưu ý rằng một số chuỗi có thể được bật ra ngoài theo nhiều cách, ví dụ như chuỗi
(()())
Khi bật ra ngoài có thể là:
()(())
hoặc là
(())()
Tuy nhiên, mỗi chuỗi có ít nhất một giải pháp .
Bài tập
Viết chương trình lấy chuỗi cân bằng làm đầu vào và đầu ra chuỗi đó bật ra ngoài. Trong trường hợp có thể có nhiều đầu ra hợp lệ, bạn chỉ cần xuất một trong số chúng. Bạn có thể sử dụng một loại cú đúp khác nhau ( <>
, []
hoặc {}
) nếu bạn rất muốn.
Đây là một cuộc thi golf-code, vì vậy bạn nên cố gắng giảm thiểu kích thước mã nguồn của mình, được đo bằng byte.
Các trường hợp thử nghiệm
(()()) -> ()(()), (())()
(()(())()) -> (()(())())
((())())() -> (()(()()))