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

โปรแกรมค้นหาความยาวของลำดับย่อยทั่วไปที่ยาวที่สุดของสามสตริงใน Python


สมมติว่าเรามีสามสตริง s1, s2 และ s3 เราต้องหาความยาวของลำดับย่อยร่วมที่ยาวที่สุด

ดังนั้น หากอินพุตเป็น s1 ="ababchemxde" s2 ="pyakcimde" s3 ="oauctime" ผลลัพธ์จะเป็น 4 เนื่องจากลำดับย่อยทั่วไปที่ยาวที่สุดคือ "acme"

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

  • m :=ขนาดของ s1, n :=ขนาดของ s2, o :=ขนาดของ s3
  • dp :=เมทริกซ์ 3 มิติขนาด (o + 1) x (n + 1) x (m + 1)
  • สำหรับฉันในช่วง 1 ถึง m ทำ
    • สำหรับ j ในช่วง 1 ถึง n ทำ
      • สำหรับ k ในช่วง 1 ถึง o ทำ
        • ถ้า s1[i - 1], s2[j - 1], s3[k - 1] เหมือนกัน ดังนั้น
          • dp[i, j, k] :=1 + dp[i - 1, j - 1, k - 1]
        • มิฉะนั้น
          • dp[i, j, k] =สูงสุดของ (dp[i - 1, j, k], dp[i, j - 1, k] และ dp[i,j, k - 1])
  • ผลตอบแทน dp[m, n, o]

ตัวอย่าง (Python)

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

class Solution:
   def solve(self, s1, s2, s3):
      m = len(s1)
      n = len(s2)
      o = len(s3)
      dp = [[[0 for i in range(o + 1)] for j in range(n + 1)] for k in range(m + 1)]
      for i in range(1, m + 1):
         for j in range(1, n + 1):
            for k in range(1, o + 1):
               if s1[i - 1] == s2[j - 1] == s3[k - 1]:
                  dp[i][j][k] = 1 + dp[i - 1][j - 1][k - 1]
               else:
                  dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j - 1][k], dp[i][j][k - 1])
         return dp[m][n][o]
ob = Solution()
s1 = "ababchemxde"
s2 = "pyakcimde"
s3 = "oauctime"
print(ob.solve(s1, s2, s3))

อินพุต

"ababchemxde", "pyakcimde", "oauctime"

ผลลัพธ์

4