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

โปรแกรมตรวจสอบว่าเราสามารถแปลงสตริงเป็นการเคลื่อนไหว K ได้หรือไม่โดยใช้Python


สมมติว่าเรามีสองสตริง s และ t เราต้องตรวจสอบว่า s สามารถแปลงเป็น t ใน k ย้ายหรือน้อยกว่าได้หรือไม่ ในการย้ายคุณสามารถดำเนินการเหล่านี้ได้

  • เลือกดัชนี j (เริ่มจาก 1) ใน s โดยที่ 1 <=j <=ขนาดของ s และ j ไม่ถูกเลือกในการเคลื่อนไหวครั้งก่อน และเปลี่ยนอักขระที่ดัชนีนั้น i จำนวนครั้ง

  • อยู่อย่างที่เป็นอยู่

การเปลี่ยนอักขระในที่นี้หมายถึงการแทนที่ด้วยตัวอักษรถัดไปในตัวอักษร (หากตัวอักษรคือ 'z' ให้ตัดเป็น 'a') ดังนั้นการขยับอักขระทีละ i แสดงว่าใช้การดำเนินการกะ i ครั้ง

ดังนั้น หากอินพุตเป็น s ="poput" t ="vwput" k =9 เอาต์พุตจะเป็น True เพราะที่ i =6 เราสามารถแปลง 'p' เป็น 'v' และที่ i =8 เราสามารถแปลง 'o' เป็น 'w' ได้

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

  • ถ้าขนาดของ s ไม่เหมือนกับขนาดของ t แล้ว

    • คืนค่าเท็จ

  • count :=การถืออาร์เรย์ (ขั้นต่ำ 1 และ (k - i + 1 +(k - i)/26)) สำหรับ i ทั้งหมดตั้งแต่ 0 ถึง 25

  • สำหรับแต่ละอักขระ c1 จาก s และ c2 จาก t ทำ

    • ถ้า c1 ไม่เหมือนกับ c2 แล้ว

      • diff :=(ASCII ของ c2 - ASCII ของ c1 + 26) mod 26

      • ถ้า count[diff] <=0 แล้ว

        • คืนค่าเท็จ

      • นับ[diff] :=นับ[diff] - 1

  • คืนค่า True

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

ตัวอย่าง

def solve(s, t, k):
   if len(s) != len(t):
      return False
   count = [min(1, k - i + 1) + (k - i)//26 for i in range(26)]
   for c1, c2 in zip(s, t):
      if (c1 != c2):
         diff = (ord(c2) - ord(c1) + 26) % 26
         if count[diff] <= 0:
            return False
         count[diff] -= 1
   return True
s = "poput"
t = "vwput"
k = 9
print(solve(s, t,k))

อินพุต

"poput","vwput",9

ผลลัพธ์

True