สมมติว่าเรามีสองสตริง s และ t เราต้องตรวจสอบว่า s และ t อยู่ใกล้หรือไม่ เราสามารถพูดได้ว่าสายอักขระสองเส้นอยู่ใกล้กันถ้าเราสามารถบรรลุหนึ่งจากอีกสายหนึ่งโดยใช้การดำเนินการต่อไปนี้ -
-
แลกเปลี่ยนอักขระสองตัวที่มีอยู่ (เหมือน abcde ถึง aecdb)
-
เปลี่ยนทุกการเกิดขึ้นของตัวละครที่มีอยู่เป็นตัวละครอื่นที่มีอยู่ และทำเช่นเดียวกันกับตัวละครอื่นๆ ด้วย (เช่น aacabb -> bbcbaa (ในที่นี้ a ทั้งหมดจะถูกแปลงเป็น b และในทางกลับกัน))
เราสามารถใช้การดำเนินการกับสตริงใดก็ได้กี่ครั้งก็ได้ตามต้องการ
ดังนั้น หากอินพุตเป็น s ="zxyyyx", t ="xyyzzz" ผลลัพธ์จะเป็นจริง เพราะเราสามารถรับ t จาก s ได้ใน 3 การดำเนินการ ("zxyyyx" -> "zxxyyy"), ("zxxyyy" -> "yxxzzz") และ ("yxxzzz" -> "xyyzzz")
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ถ้า s และ t มีอักขระพิเศษใด ๆ แล้ว
-
คืนค่าเท็จ
-
-
a :=รายการค่าความถี่ทั้งหมดของอักขระใน s
-
b :=รายการค่าความถี่ทั้งหมดของอักขระใน t
-
เรียงลำดับรายการ
-
เรียงลำดับรายการ b
-
ถ้า a ไม่เหมือนกับ b แล้ว
-
คืนค่าเท็จ
-
-
คืนค่า True
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
from collections import Counter
def solve(s, t):
if set(s) != set(t):
return False
a = list(Counter(s).values())
b = list(Counter(t).values())
a.sort()
b.sort()
if a != b:
return False
return True
s = "zxyyyx"
t = "xyyzzz"
print(solve(s, t)) อินพุต
"zxyyyx", "xyyzzz"
ผลลัพธ์
True