สมมติว่าเราได้รับสตริง เราต้องหาลำดับย่อยของพาลินโดรมที่มีความยาวเท่ากันและไม่มีอักขระสองตัวที่ต่อเนื่องกันยกเว้นตรงกลาง เราต้องคืนค่าความยาวของสตริงย่อยประเภทนี้เป็นเอาต์พุต
ดังนั้น หากอินพุตเป็น s ='efeffe' ผลลัพธ์จะเป็น 4
ผลลัพธ์คือ 4 เนื่องจากมีลำดับย่อยพาลินโดรมเพียงรายการเดียวที่มีความยาวเท่ากัน สตริงคือ 'effe' ที่มีความยาว 4
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดของ s
-
dp :=หนึ่ง n x n อาร์เรย์ 2d โดยที่แต่ละรายการเป็นคู่ในรูปแบบ (0, สตริงว่าง)
-
สำหรับฉันอยู่ในช่วง n-1 ถึง -1 ลดลง 1 ทำ
-
สำหรับ j ในช่วง i+1 ถึง n ทำ
-
ถ้า s[i] เหมือนกับ s[j] และสตริงของ dp[i+1, j-1] ไม่ใช่ s[i] ดังนั้น
-
dp[i, j] :=สร้างคู่ (องค์ประกอบแรกของ dp[i+1, j-1] + 2, s[i])
-
-
มิฉะนั้น
-
dp[i, j] :=เลือกระหว่าง (dp[i+1, j], dp[i, j-1], dp[i+1,j-1]) ซึ่งองค์ประกอบแรกของคู่มีค่าสูงสุดพี>
-
-
คืนค่าองค์ประกอบแรกของคู่ที่เก็บไว้ที่ dp[0, n-1]
-
-
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
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')) อินพุต
'efeffe'
ผลลัพธ์
4