ตรวจสอบวงเล็บสมดุลแบบประหยัดหน่วยความจำ
กำหนดสตริง str ที่ประกอบด้วยวงเล็บ '(', ')', '{', '}', '[', ']' ต้องการตรวจสอบว่าวงเล็บสมดุลหรือไม่ วงเล็บสมดุลหมายถึง:
- วงเล็บเปิดและปิดเป็นคู่ประเภทเดียวกัน
- วงเล็บปิดตามลำดับที่ถูกต้อง (LIFO)
ตัวอย่าง: {([])} → True
อัลกอริทึม (O(1) space, O(N²) time)
แนวคิดคือใช้ตัวแปรดัชนี i, j และนับ cnt เพื่อติดตามตำแหน่งวงเล็บที่ยังไม่จับคู่ โดยไม่ใช้สแท็กเพิ่มเติม
- เริ่มต้น
cnt = 0, i = 0, j = -1 - กำหนดฟังก์ชัน
solve(s, temp):- ลด
cntลง 1 - แปลง
sเป็นลิสต์ - ถ้า
j > -1และs[j] == temp(พบวงเล็บเปิดที่ตรงกัน):- ทำเครื่องหมาย
s[i] = s[j] = '#' - เลื่อน
jย้อนหลังข้าม '#' ที่ประมวลผลแล้ว - เพิ่ม
iและคืน1
- ทำเครื่องหมาย
- มิฉะนั้นคืน
0
- ลด
- ในฟังก์ชันหลัก
bracketOrderCheck(s):- ถ้า
len(s) == 0คืนTrue - วนลูป
while i < len(s):- ถ้าตัวอักษรเป็นวงเล็บปิด (
},),]) เรียกsolveด้วยวงเล็บเปิดที่ตรงกัน หากคืน0ให้คืนFalse - ถ้าเป็นวงเล็บเปิด: อัปเดต
j = i, เพิ่มiและcnt
- ถ้าตัวอักษรเป็นวงเล็บปิด (
- หลังลูป ถ้า
cnt != 0คืนFalse(ยังมีวงเล็บเปิดค้าง) - คืน
True
- ถ้า
โค้ดตัวอย่าง Python
cnt = 0
i = 0
j = -1
def solve(s, temp):
global i, j, cnt
cnt -= 1
s = list(s)
if j > -1 and s[j] == temp:
s[i] = '#'
s[j] = '#'
while j >= 0 and s[j] == '#':
j -= 1
i += 1
return 1
else:
return 0
def bracketOrderCheck(s):
global i, j, cnt
if len(s) == 0:
return True
else:
ans = False
while i < len(s):
if s[i] == '}':
ans = solve(s, '{')
if ans == 0:
return False
elif s[i] == ')':
ans = solve(s, '(')
if ans == 0:
return False
elif s[i] == ']':
ans = solve(s, '[')
if ans == 0:
return False
else:
j = i
i += 1
cnt += 1
if cnt != 0:
return False
return True
print(bracketOrderCheck("{([])}")) # True
อินพุต / เอาต์พุต
Input: "{(()[])}"
Output: True