Mô tả bài toán
Cho chuỗi s. Kiểm tra có thể chia s thành 3 chuỗi con palindrome không.
Ví dụ
s = "levelpopracecar" -> True ("level", "pop", "racecar").
Giải thuật (DP)
- Tạo bảng
dp[i][j]= True nếus[i..j]là palindrome. - Điền bảng từ dưới lên:
dp[i][j] = (s[i]==s[j]) and dp[i+1][j-1]. - Duyệt
itừ 1 đếnn-1,jtừi+1đếnn-1: nếudp[0][i-1],dp[i][j-1],dp[j][n-1]đều True -> trả về True.
Triển khai Python
def solve(s):
n = len(s)
dp = [[False] * n for _ in range(n)]
for i in range(n - 1, -1, -1):
for j in range(n):
if i >= j:
dp[i][j] = True
elif s[i] == s[j]:
dp[i][j] = dp[i + 1][j - 1]
for i in range(1, n):
for j in range(i + 1, n):
if dp[0][i - 1] and dp[i][j - 1] and dp[j][n - 1]:
return True
return False
s = "levelpopracecar"
print(solve(s))
Đầu vào
"levelpopracecar"
Đầu ra
True