สมมติว่าเรามีสตริง s ที่มีวงเล็บ '(' , ')' และอักขระภาษาอังกฤษตัวพิมพ์เล็ก เราต้องลบจำนวนวงเล็บขั้นต่ำ ( '(' หรือ ')' จากตำแหน่งใดๆ ) เพื่อให้สตริงที่เป็นผลลัพธ์มีความถูกต้องและต้องส่งคืนสตริงที่ถูกต้องในที่สุด สตริงวงเล็บจะใช้ได้เมื่อเป็นไปตามเกณฑ์เหล่านี้ทั้งหมด -
-
สตริงว่างเปล่าและมีอักขระตัวพิมพ์เล็กเท่านั้น หรือ
-
สตริงสามารถเขียนเป็น AB (A ต่อกับ B) โดยที่ A และ B เป็นสตริงที่ถูกต้อง หรือ
-
สตริงสามารถเขียนเป็นรูปแบบของ (A) โดยที่ A เป็นสตริงที่ถูกต้อง
ดังนั้น หากอินพุตเป็น s ="m)n(o)p" ผลลัพธ์จะเป็น "mn(o)p"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
stack :=รายการใหม่
-
ดัชนี :=ชุดใหม่
-
ผม :=0
-
สำหรับแต่ละ c ใน s ทำ
-
ถ้า c เหมือนกับ '(' แล้ว
-
ดันฉันเข้ากอง
-
-
มิฉะนั้นเมื่อ c เหมือนกับ ')' แล้ว
-
ถ้าขนาดของ stack เท่ากับ 0 แล้ว
-
แทรก i ลงในดัชนี
-
-
มิฉะนั้น
-
ป๊อปจากสแต็ก
-
-
ผม :=ผม + 1
-
-
-
ret :=สตริงว่าง
-
ดัชนี :=เก็บองค์ประกอบทั้งหมดไว้ในดัชนี
-
สำหรับฉันในช่วง 0 ถึงขนาด s - 1 ทำ
-
ถ้าฉันไม่ได้อยู่ในดัชนีแล้ว
-
ret :=ret + s[i]
-
-
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def solve(s):
stack = []
indexes = set()
i = 0
for c in s:
if c == '(':
stack.append(i)
elif c == ')':
if len(stack) == 0:
indexes.add(i)
else:
stack.pop()
i += 1
ret = ''
indexes = indexes.union(stack)
for i in range(len(s)):
if i not in indexes:
ret += s[i]
return ret
s = "m)n(o)p"
print(solve(s)) อินพุต
"m)n(o)p"
ผลลัพธ์
mn(o)p