เนื่องจากเราสามารถละเว้นอักขระที่เป็นตัวอักษรและตัวเลขทั้งหมดเราจะถือว่าสตริงมีเฉพาะวงเล็บต่อจากนี้ ดังเช่นในคำถามมีวงเล็บชนิดเดียวเท่านั้น "()"
ถ้าเราเอาวงเล็บที่มีสมดุลออกไปจนกว่าจะไม่สามารถเอาวงเล็บที่มีความสมดุลได้ออกไปวงเล็บที่เหลือทั้งหมดจะต้องมีลักษณะเหมือน ")) ... ) ((... (" ซึ่งเป็นวงเล็บที่ไม่สมดุลทั้งหมด) การสังเกตนี้แสดงให้เห็นว่า ก่อนหน้านี้เรามีวงเล็บปิดที่ไม่สมดุลเท่านั้นและหลังจากนั้นเรามีวงเล็บเปิดที่ไม่สมดุลเท่านั้น
นี่คืออัลกอริทึม สรุปคำนวณจุดเปลี่ยนก่อน จากนั้นจะแสดงผลลัพธ์เป็นวงเล็บปิดพิเศษสแกนสตริงตั้งแต่เริ่มต้นไปทางขวาจนถึงจุดเปลี่ยน สมมาตรมันส่งออกวงเล็บเปิดพิเศษสแกนจากปลายด้านซ้ายจนกระทั่งจุดเปลี่ยน
str
n
turning_point=0, maximum_count=0, count=0
เริ่มต้น สำหรับแต่ละi
จากที่0
ต้องn-1
ทำดังต่อไปนี้
- ถ้า
str[i] = ')'
เพิ่ม 1 ถึงcount
; มิฉะนั้นให้ลบ 1
- หาก
count > maximum_count
ชุดและturning_point=i
maximum_count=count
ตอนนี้turning_point
เป็นดัชนีของจุดเปลี่ยน
maximum_count=0, count=0
ตั้งค่าใหม่ สำหรับแต่ละi
จากที่0
ต้องturning_point
ทำดังต่อไปนี้
- ถ้า
str[i] = ')'
เพิ่ม 1 ถึงcount
; มิฉะนั้นให้ลบ 1
- หากชุด
count > maximum_count
maximum_count = count
เอาต์พุตi
เป็นดัชนีของวงเล็บปิดที่ไม่สมดุล
maximum_count=0, count=0
ตั้งค่าใหม่ สำหรับแต่ละi
จากn-1
การturning_point+1
ลงทำดังต่อไปนี้
- ถ้า
str[j] = '('
เพิ่ม 1 ถึงcount
; มิฉะนั้นให้ลบ 1
- หากชุด
count > maximum_count
maximum_count = count
เอาต์พุตi
เป็นดัชนีของวงเล็บเปิดที่ไม่สมดุล
O ( n )O ( 1 )โอ( คุณ)ยู
หากเราวิเคราะห์อัลกอริทึมข้างต้นเราจะเห็นว่าในความเป็นจริงเราไม่จำเป็นต้องค้นหาและใช้จุดเปลี่ยนเลย การสังเกตที่ดีว่าวงเล็บปิดที่ไม่สมดุลทั้งหมดเกิดขึ้นก่อนที่จะละเว้นวงเล็บเปิดที่ไม่สมดุลทั้งหมดแม้ว่าจะน่าสนใจ
นี่คือรหัสในหลาม
เพียงกด "เรียกใช้" เพื่อดูผลการทดสอบหลายรายการ
แบบฝึกหัดที่ 1แสดงให้เห็นว่าอัลกอริธึมด้านบนจะแสดงชุดของวงเล็บที่มีความสำคัญเชิงลบน้อยที่สุดเพื่อให้วงเล็บที่เหลืออยู่นั้นสมดุล
ปัญหา 1.เราสามารถพูดคุยกับอัลกอริทึมทั่วไปในกรณีที่สตริงมีวงเล็บสองชนิดเช่น "() []" เราต้องกำหนดวิธีการรับรู้และปฏิบัติต่อสถานการณ์ใหม่กรณีการสอดแทรก "([)]"