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