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

โปรแกรมหาค่า K ที่น้อยที่สุดสำหรับ K-Similar Strings ใน Python


สมมติว่าเรามีสองสตริง s และ t สตริงทั้งสองนี้เป็น K-similar หากเราสามารถสลับตำแหน่งของตัวอักษรสองตัวใน s ตรง K ครั้งเพื่อให้สตริงผลลัพธ์เป็น t ดังนั้น เรามีแอนนาแกรมสองตัว s และ t เราต้องหา K ที่เล็กที่สุดที่ s และ t เป็น K-similar

ดังนั้น หากอินพุตเป็น s ="abc" t ="bac" ผลลัพธ์จะเป็น 1

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

  • กำหนดฟังก์ชั่นเพื่อนบ้าน() นี่จะใช้เวลา new_data

  • สำหรับแต่ละดัชนี i และค่า c ใน new_data ให้ทำ

    • ถ้า c ไม่เหมือนกับ t[i] แล้ว

      • ออกจากวง

  • สำหรับ j ในช่วง i+1 ถึงขนาดของ new_data - 1 ทำ

    • ถ้า u[j] เหมือนกับ t[i] แล้ว

      • แลกเปลี่ยน new_data[i] new_data[j]

      • สร้างสตริงโดยการรวมองค์ประกอบทั้งหมดจาก new_data แล้วกลับมาเริ่มใหม่อีกครั้งจากพื้นที่นี้จากการโทรครั้งถัดไป

      • แลกเปลี่ยน new_data[i] new_data[j]

  • จากวิธีหลัก ให้ทำดังนี้:

  • q :=สร้างหนึ่งคิวและแทรกคู่ (s, 0)

  • เห็น :=ชุดใหม่จาก s

  • ในขณะที่ q ไม่ว่างให้ทำ

    • (u, swap_cnt) :=รายการแรกของ q และลบออกจาก q

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

      • ส่งคืน swap_cnt

    • สำหรับแต่ละ v ในเพื่อนบ้าน (ตามรายการ) ทำ

      • ถ้าไม่เห็น v แล้ว

        • ทำเครื่องหมาย v ตามที่เห็น

        • แทรก (v, swap_cnt+1) ต่อท้าย q

  • คืนค่า 0

ตัวอย่าง

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

from collections import deque
def solve(s, t):
   def swap(data, i, j):
      data[i], data[j] = data[j], data[i]

   def neighbors(new_data):
      for i, c in enumerate(new_data):
         if c != t[i]: break

      for j in range(i+1, len(new_data)):
         if u[j] == t[i]:
            swap(new_data, i, j)
            yield "".join(new_data)
            swap(new_data, i, j)

   q = deque([(s, 0)])
   seen = set(s)
   while q:
      u, swap_cnt = q.popleft()
      if u == t:
         return swap_cnt
      for v in neighbors(list(u)):
         if v not in seen:
            seen.add(v)
            q.append((v, swap_cnt+1))
   return 0

s = "abc"
t = "bac"
print(solve(s, t))

อินพุต

"abc, bac"

ผลลัพธ์

1