สมมติว่าเรามีสตริง s นี่คือการเข้ารหัสสตริงที่ยาวกว่า s ถูกแสดงเป็นการต่อกันของ n(t), n(t) แทนการต่อกันของ t, n ครั้ง และ t เป็นสตริงปกติหรือเป็นสตริงที่เข้ารหัสอื่นแบบเรียกซ้ำ เราต้องหาเวอร์ชั่นถอดรหัสของ s.
ดังนั้น หากอินพุตเป็น s ="3(pi)2(3(am))0(f)1(u)" ผลลัพธ์จะเป็น "pipipipiamamamamamamu"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ผม :=0
-
กำหนดฟังก์ชัน parse() นี่จะใช้เวลา
-
ans :=รายการใหม่
-
ในขณะที่ i <ขนาดของ s และ s[i] ไม่เหมือนกับ ")" ให้ทำ
-
ถ้า s[i] เป็นตัวเลข ดังนั้น
-
d :=0
-
ในขณะที่ s[i] เป็นตัวเลข ให้ทำ
-
d :=10 * d + ส่วนจำนวนเต็มของ s[i]
-
ผม :=ผม + 1
-
-
ผม :=ผม + 1
-
ส่วน :=parse()
-
ผม :=ผม + 1
-
แทรกเซ็กเมนต์ d ครั้งลงใน ans
-
-
มิฉะนั้น
-
ใส่ s[i] ต่อท้าย ans
-
ผม :=ผม + 1
-
-
-
ส่งคืนสตริงหลังจากเข้าร่วมรายการของ ans
-
จากวิธีหลัก return parse()
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
class Solution: def solve(self, s): i = 0 def parse(): nonlocal i ans = [] while i < len(s) and s[i] != ")": if s[i].isdigit(): d = 0 while s[i].isdigit(): d = 10 * d + int(s[i]) i += 1 i += 1 segment = parse() i += 1 ans.extend(segment for _ in range(d)) else: ans.append(s[i]) i += 1 return "".join(ans) return parse() ob = Solution() s = "3(pi)2(3(am))0(f)1(u)" print(ob.solve(s))
อินพุต
"3(pi)2(3(am))0(f)1(u)"
ผลลัพธ์
pipipiamamamamamamu