สมมติว่าเรามีสตริงตัวพิมพ์เล็ก s เราต้องการหาความยาวของลำดับย่อย (subsequence) แบบพาลินโดรมที่ยาวที่สุดใน s
เช่น ถ้าข้อมูลนำเข้าคือ s = "aolpeuvekyl" ผลลัพธ์จะเป็น 5 เนื่องจากพาลินโดรมคือ "level"
ขั้นตอนการแก้ปัญหา (Dynamic Programming แบบ Top-down)
n := len(s)- ฟังก์ชัน
dp(i, j):- ถ้า
i == jคืน 1 - ถ้า
i > jคืน 0 - มิฉะนั้น:
- ถ้า
s[i] == s[j]คืน2 + dp(i+1, j-1) - มิฉะนั้น คืน
max(dp(i+1, j), dp(i, j-1))
- ถ้า
- ถ้า
- คืน
dp(0, n-1)
ตัวอย่างโค้ด
class Solution:
def solve(self, s):
n = len(s)
def dp(i, j):
if i == j:
return 1
elif i > j:
return 0
else:
if s[i] == s[j]:
return 2 + dp(i + 1, j - 1)
else:
return max(dp(i + 1, j), dp(i, j - 1))
return dp(0, n - 1)
ob = Solution()
s = "aolpeuvekyl"
print(ob.solve(s))
ข้อมูลนำเข้า
"aolpeuvekyl"
ผลลัพธ์
5