Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาจำนวนวงเล็บน้อยที่สุดที่ต้องลบเพื่อให้ถูกต้องใน Python

สมมติว่ามีสตริง s ประกอบด้วยวงเล็บ '(', ')' และตัวอักษรภาษาอังกฤษพิมพ์เล็ก ต้องลบวงเล็บน้อยที่สุดเพื่อให้สตริงที่เหลือเป็นวงเล็บที่ถูกต้อง (valid parentheses) วงเล็บถูกต้องหมายถึง:

  • สตริงว่างหรือมีแต่ตัวอักษร
  • เป็น AB โดย A, B ถูกต้อง
  • เป็น (A) โดย A ถูกต้อง

ตัวอย่าง: s = "m)n(o)p" ผลลัพธ์ "mn(o)p"

วิธีแก้ปัญหา

  1. stack := [], indexes := set(), i := 0
  2. วน c ใน s:
    • ถ้า c == '(': stack.append(i)
    • ถ้า c == ')':
      • ถ้า stack ว่าง: indexes.add(i)
      • มิฉะนั้น: stack.pop()
    • i += 1
  3. indexes := indexes.union(stack)
  4. สร้าง ret โดยข้ามดัชนีใน indexes
  5. คืนค่า ret

ตัวอย่างโค้ด

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