สมมติว่า เรามีสตริงตัวพิมพ์เล็ก s ที่มีตัวอักษรและวงเล็บ "(" และ ")" เราต้องย้อนกลับทุกสตริงที่อยู่ภายในวงเล็บในลักษณะวนซ้ำและส่งกลับสตริงที่เป็นผลลัพธ์
ดังนั้น หากอินพุตเป็น s ="back(aps)ce" เอาต์พุตจะเป็น "backspace"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน trav() สิ่งนี้จะใช้เวลา s, dir, start, close:=close, ans:=ans
-
end :="(" ถ้า dir เหมือนกับ -1 มิฉะนั้น ")"
-
อื่นๆ :="(" ถ้าสิ้นสุดเหมือนกับ ")" มิฉะนั้น ")"
-
ในขณะที่ start
-
ถ้า s[start] เหมือนกับตัวอื่นๆ แล้ว
-
trav(s, -dir, close[other, start] - dir)
-
start :=close[other, start] + dir
-
-
มิฉะนั้น
-
ใส่ s[start] ต่อท้าย ans
-
start :=start + dir
-
-
-
-
จากหน้าที่หลัก ให้ทำดังต่อไปนี้ -
-
ans :=รายการใหม่
-
ปิด :=แผนที่ใหม่ที่มีคีย์ ")" และ "(" ในขั้นต้น ค่าเป็นสองแผนที่ว่าง
-
stack :=รายการใหม่
-
สำหรับแต่ละดัชนี I และค่า c ใน s ทำ
-
ถ้า c เหมือนกับ "(" แล้ว
-
ดันฉันเข้ากอง
-
-
มิฉะนั้นเมื่อ c เหมือนกับ ")" แล้ว
-
o :=ด้านบนสุดของ stack แล้วป๊อปจาก stack
-
ปิด[")", i] :=o
-
ปิด["(", o] :=ฉัน
-
-
-
trav(s, 1, 0)
-
กลับ ans เข้าร่วมด้วยสตริงว่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution:
def solve(self, s):
ans = []
close = {")": {}, "(": {}}
stack = []
for i, c in enumerate(s):
if c == "(":
stack.append(i)
elif c == ")":
o = stack.pop()
close[")"][i] = o
close["("][o] = i
def trav(s, dir, start, close=close, ans=ans):
end = "(" if dir == -1 else ")"
other = "(" if end == ")" else ")"
while start < len(s) and s[start] != end:
if s[start] == other:
trav(s, −dir, close[other][start] − dir)
start = close[other][start] + dir
else:
ans.append(s[start])
start += dir
trav(s, 1, 0)
return "".join(ans)
ob = Solution()
print(ob.solve("back(aps)ce")) อินพุต
"back(aps)ce"
ผลลัพธ์
backspace