สมมติว่าเรามีสตริง s ที่มีวงเล็บเปิดและปิด '(' และ ')' เราสามารถพูดได้ว่าสตริงวงเล็บมีความสมดุลเมื่อ −
-
วงเล็บซ้าย '(' มีวงเล็บ 2 วงเล็บขวาติดกัน '))'
-
วงเล็บซ้าย '(' ต้องอยู่ข้างหน้าวงเล็บขวาสองอันที่ต่อเนื่องกัน '))'
ตัวอย่างเช่น "())", "())(())))" มีความสมดุล แต่ ")()", "()))" ไม่สมดุล ถ้าเรามีสตริงดังกล่าว เราต้องนับจำนวนวงเล็บ (เปิดหรือปิด) เพื่อให้สตริงมีความสมดุล
ดังนั้น หากอินพุตเป็น s ="(()))))" ผลลัพธ์จะเป็น 1 เพราะถ้าเราแยกมันออกมา เราจะได้ "( ()) )) ))" ดังนั้นเราจึงต้องการ วงเล็บซ้ายหนึ่งอันเพื่อสร้างสตริง "( ()) ()) ))" เพื่อให้สมดุล
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
:=0, n :=ขนาดของ s
-
ret :=0, ผม :=0
-
ในขณะที่ฉัน
-
ถ้า s[i] เหมือนกับ '(' แล้ว
-
-
:=o + 1
-
มิฉะนั้น
-
ถ้า i + 1
-
ถ้า o เป็น 0 แล้ว
-
ret :=ret + 1
-
-
มิฉะนั้น
-
-
-
-
:=o - 1
-
ผม :=ผม + 1
-
มิฉะนั้น
-
ret :=ret + 1
-
ถ้า o เป็น 0 แล้ว
-
ret :=ret + 1
-
-
มิฉะนั้น
-
-
-
:=o - 1
-
ผม :=ผม + 1
-
-
รีเทิร์น + 2 * o
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
def solve(s): o = 0 n = len(s) ret = 0 i = 0 while i < n: if s[i] == '(': o += 1 else: if i + 1 < n and s[i + 1] == ')': if not o: ret += 1 else: o -= 1 i += 1 else: ret += 1 if not o: ret += 1 else: o -= 1 i += 1 return ret + 2 * o s = "(())))))" print(solve(s))
อินพุต
"(())))))"
ผลลัพธ์
3