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

โปรแกรมขยายสตริงที่แสดงเป็นรูปแบบ n(t) ใน Python


สมมติว่าเรามีสตริง 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