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

โปรแกรมค้นหาจำนวนอาร์เรย์สี่เหลี่ยมจัตุรัสใน Python


สมมติว่าเราต้องการสร้างสตริงเป้าหมายของตัวพิมพ์เล็ก ในตอนแรก เรามีลำดับเป็น n '?' เครื่องหมาย (n คือความยาวของสตริงเป้าหมาย) นอกจากนี้เรายังมีตราประทับของตัวพิมพ์เล็ก ในแต่ละรอบ เราสามารถวางตราประทับไว้เหนือลำดับ และแทนที่ตัวอักษรทุกตัวใน the ด้วยจดหมายที่เกี่ยวข้องจากตราประทับนั้น คุณสามารถทำได้ถึง 10 * n รอบ

ตัวอย่างเช่น ให้พิจารณาลำดับเริ่มต้นคือ "?????" และตราประทับคือ "abc" จากนั้นเราอาจสร้างสตริงเช่น "abc?", "?abc?", "??abc" ในลำดับแรก เปลี่ยน. หากลำดับนั้นสามารถประทับตราได้ ให้ส่งคืนอาร์เรย์ของดัชนีด้วยตัวอักษรซ้ายสุดที่ประทับในแต่ละตาแหน่ง หากไม่สามารถทำได้ ให้ส่งคืนอาร์เรย์ว่าง ดังนั้นเมื่อลำดับคือ "ababc" และ thestamp คือ "abc" คำตอบก็เหมือนกับ [0, 2] เพราะเราสามารถสร้างแบบ "?????" -> "เอบีซี?? -> "เอบีซี".

ดังนั้น หากอินพุตเป็น s ="abcd" t ="abcdbcd" ผลลัพธ์จะเป็น [3,0]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ถ้าขนาดเท่ากับ 1 แล้ว

    • ส่งคืนรายการจาก 0 เป็น t เมื่ออักขระทั้งหมดใน t เหมือนกันและเป็น s[0] มิฉะนั้นจะเป็นรายการว่างใหม่

  • ans :=รายการใหม่

  • ในขณะที่ t ไม่เหมือนกับขนาดของ t จำนวน "?" เครื่องหมาย ทำ

    • tmp :=t

    • สำหรับฉันในช่วง 0 ถึงขนาด s ทำ

      • สำหรับ j ในขนาด s เหลือ i+1:

        • ค้นหา :=ฉันหมายเลขของ "?" เชื่อมสตริงย่อยของ s[จากดัชนี i ถึง j-1] ต่อกัน (ขนาดของ s - j) จำนวน "?"

        • ในขณะที่การค้นหาอยู่ใน t ให้ทำ

          • แทรกที่มีการค้นหาอยู่ใน t ที่ส่วนท้ายของ ans

          • t :=แทนที่การค้นหาด้วยขนาดของ s จำนวน "?" เพียงครั้งเดียว

        • ถ้า t เท่ากับขนาดของ t จำนวน "?" แล้ว

          • ออกจากวง

        • ถ้า t เท่ากับขนาดของ t จำนวน "?" แล้ว

          • ออกจากวง

      • ถ้า tmp เหมือนกับ t แล้ว

        • ออกจากวง

  • ย้อนกลับของ ans.

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น

def solve(s, t):
   if len(s) == 1:
      return [i for i in range(len(t))] if all(t==s[0] for t in t)else []

   ans = []
   while t != "?" * len(t):
      tmp = t
      for i in range(len(s)):
         for j in reversed(range(i+1, len(s)+1)):
            search = "?" * i + s[i:j] + "?" * (len(s)-j)
            while t.find(search) != -1:
               ans.append(t.find(search))
               t = t.replace(search, "?"*len(s), 1)
            if t == "?" * len(t): break
         if t == "?" * len(t): break
      if tmp == t: return []
   return ans[::-1]

s = "abcd"
t = "abcdbcd"
print(solve(s, t))

อินพุต

"abcd", "abcdbcd"

ผลลัพธ์

[3,0]