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

โปรแกรมนับจำนวนการดำเนินการที่จำเป็นในการสร้างสตริงเป็นการต่อสตริงเดียวกันสองครั้งในPython


สมมติว่าเรามีสตริงตัวพิมพ์เล็ก s ตอนนี้ให้พิจารณาการดำเนินการ ซึ่งเราสามารถลบ แทรก หรืออัปเดตอักขระใดก็ได้ใน s เราต้องนับจำนวนการดำเนินการขั้นต่ำที่จำเป็นในการสร้าง s =(t concatenate t) สำหรับสตริง t ใดๆ

ดังนั้น หากอินพุตเป็น s ="pqrxqsr" ผลลัพธ์จะเป็น 2 เพราะเราสามารถอัปเดต "x" ด้วย "p" และลบ "s" ดังนั้น s คือ "pqrpqr" นี่คือ s =t ต่อ t สำหรับ t ="pqr"

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

  • กำหนดฟังก์ชัน edit_distance() นี่จะใช้เวลา s1, s2
  • ม :=ขนาดของ s1
  • n :=ขนาดของ s2
  • cur :=รายการใหม่จากช่วง 0 ถึง n
  • สำหรับฉันในช่วง 0 ถึง m - 1 ทำ
    • ก่อนหน้า :=cur
    • cur :=รายการที่มี (i + 1) และ n จำนวน 0s
    • สำหรับ j ในช่วง 0 ถึง n - 1 ทำ
      • cur[j + 1] :=prev[j] ถ้า s1[i] และ s2[j] เหมือนกันไม่เช่นนั้น (ค่าต่ำสุดของ cur[j], prev[j], prev[j + 1]) + 1
  • ผลตอบแทนเคอร์[n]
  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −
  • res :=ขนาดของ s
  • สำหรับฉันในช่วง 0 ถึงขนาด s - 1 ทำ
    • res :=ขั้นต่ำของ edit_distance (สตริงย่อยของ s จากดัชนี 0 ถึง i - 1, สตริงย่อยของ s จากดัชนี i ถึงปลาย) และ res
  • ผลตอบแทน

ตัวอย่าง

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

def solve(s):
   def edit_distance(s1, s2):
      m, n = len(s1), len(s2)
      cur = list(range(n + 1))
      for i in range(m):
         prev, cur = cur, [i + 1] + [0] * n
         for j in range(n):
            cur[j + 1] = (prev[j]
            if s1[i] == s2[j] else min(cur[j], prev[j], prev[j + 1]) + 1)
         return cur[n]

   res = len(s)
   for i in range(len(s)):
      res = min(edit_distance(s[:i], s[i:]), res)
   return res

s = "pqrxqsr"
print(solve(s))

อินพุต

"pqrxqsr"

ผลลัพธ์

None