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

โปรแกรมหาความยาว subsequence แพลินโดรมคู่ที่ยาวที่สุดด้วย Python

โจทย์: หา subsequence แพลินโดรม (palindromic subsequence) ที่มีความยาวเป็นเลขคู่ และไม่มีตัวอักษรซ้ำติดกันยกเว้นตรงกลาง ใช้ Dynamic Programming เก็บคู่ (ความยาว, ตัวอักษรสุดท้าย) ในตาราง 2 มิติ

อัลกอริทึม

  1. สร้างตาราง dp[n][n] เก็บ tuple (length, last_char) เริ่มต้น (0, '')
  2. วน i จาก n-1 ถึง 0, j จาก i+1 ถึง n-1
  3. ถ้า s[i] == s[j] และ dp[i+1][j-1][1] != s[i]: dp[i][j] = (dp[i+1][j-1][0] + 2, s[i])
  4. ไม่เช่นนั้น: dp[i][j] = max ของ dp[i+1][j], dp[i][j-1], dp[i+1][j-1] ตามความยาว
  5. คืนค่า dp[0][n-1][0]

ตัวอย่างโค้ด

def solve(s):
    n = len(s)
    dp = [[(0, '')] * n for _ in range(n)]
    for i in range(n-1, -1, -1):
        for j in range(i+1, n):
            if s[i] == s[j] and dp[i+1][j-1][1] != s[i]:
                dp[i][j] = (dp[i+1][j-1][0] + 2, s[i])
            else:
                dp[i][j] = max(dp[i+1][j], dp[i][j-1], dp[i+1][j-1], key=lambda x: x[0])
    return dp[0][n-1][0]

print(solve('efeffe'))  # Output: 4

อินพุต/เอาต์พุต

Input: 'efeffe'
Output: 4

คำอธิบาย: subsequence แพลินโดรมคู่ที่ยาวที่สุดคือ 'effe' ความยาว 4