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

โปรแกรมเพิ่มความยาว Palindrome จาก Subsequence สองสตริงใน Python

ปัญหา

สองสตริง s, t เลือก Subsequence sub1 จาก s และ sub2 จาก t ต่อกัน (sub1 + sub2) หา Palindrome ยาวที่สุดได้

ตัวอย่าง

s = "hillrace", t = "cargame" → Output: 7

sub1 = "race" (จาก s), sub2 = "car" (จาก t) → "racecar" (Palindrome, Length 7)

อัลกอริทึม (DP on Concatenated String)

  1. Concatenate: word = s + t
  2. DP[i][j] = LPS (Longest Palindromic Subsequence) Length ใน word[i..j]
  3. Standard LPS DP: ถ้า word[i]==word[j] → 2+DP[i+1][j-1] Else Max(DP[i+1][j], DP[i][j-1])
  4. คำตอบ: Max ของ DP[i][n+j] สำหรับทุก i,j ที่ s[i] == t[j] (จุดเชื่อมระหว่าง s และ t)

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

def solve(s, t):
    n, m = len(s), len(t)
    word = s + t
    dp = [[0] * (n + m) for _ in range(n + m)]
    
    for i in range(n + m - 1, -1, -1):
        for j in range(i, n + m):
            if i == j:
                dp[i][j] = 1
            elif word[i] == word[j]:
                dp[i][j] = 2 + dp[i + 1][j - 1]
            else:
                dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
    
    ans = 0
    for i in range(n):
        for j in range(m - 1, -1, -1):
            if s[i] == t[j]:
                ans = max(ans, dp[i][n + j])
    return ans

s = "hillrace"
t = "cargame"
print(solve(s, t))  # 7

ความซับซ้อน

  • Time: O((n+m)²)
  • Space: O((n+m)²)

n,m ≤ 1000 ใช้ได้ (10⁶ Operations)