สมมติว่าเรามีสตริง 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