สมมติว่าเรามีสตริง S หาความยาวของซับสตริงพาลินโดรมยาวที่สุด สมมติความยาว S ไม่เกิน 1000 ตัวอย่าง: "BABAC" → พาลินโดรมยาวสุด "BAB" ความยาว 3
ขั้นตอนการแก้ปัญหา (Dynamic Programming)
- สร้างเมทริกซ์
dpขนาดn×nเติมFalse - ตั้งค่า diagonal:
dp[i][i] = Trueสำหรับทุกi max_length = 1,start = 0- วนลูปความยาว
lจาก 2 ถึงn:- วนลูป
iจาก 0 ถึงn-l:end = i + l - 1- ถ้า
l == 2:- ถ้า
S[i] == S[end]:dp[i][end] = True, อัปเดตmax_length,start
- ถ้า
- อื่นๆ:
- ถ้า
S[i] == S[end]และdp[i+1][end-1]:dp[i][end] = True, อัปเดตmax_length,start
- ถ้า
- วนลูป
- คืนค่า
max_length
ตัวอย่างโค้ด Python
class Solution(object):
def solve(self, s):
n = len(s)
dp = [[False for _ in range(n)] for _ in range(n)]
for i in range(n):
dp[i][i] = True
max_length = 1
start = 0
for l in range(2, n + 1):
for i in range(n - l + 1):
end = i + l - 1
if l == 2:
if s[i] == s[end]:
dp[i][end] = True
max_length = l
start = i
else:
if s[i] == s[end] and dp[i + 1][end - 1]:
dp[i][end] = True
max_length = l
start = i
return max_length
ob = Solution()
print(ob.solve('BABAC')) # Output: 3
อินพุต / เอาต์พุต
Input: "ABBABBC"
Output: 5 (ซับสตริง "BBABB" หรือ "ABBBA")