Я кодирую функцию динамического программирования, которая находит самую длинную подстроку, которая является палиндромом в Python:
def longestPalindrome(s: str) -> str:
dict = {}
start = 0
end = 0
# initialize base cases and left of base cases
for i in range(len(s)):
dict[(i,i)] = 1
for y in range(len(s), -1, -1):
for x in range(y, len(s)):
print((x,y))
# memo check
if (x, y) not in dict.keys():
if s[x] == s[y]:
if x - y == 1:
dict[(x,y)] = 1
if (end - start) <= (x-y):
start = y
end = x
elif dict[(x-1,y+1)] == 1: # if substr betweet x & y is palindrome
dict[(x,y)] = 1
if (end - start) <= (x-y):
start = y
end = x
else: # ISSUE HERE
dict[(x,y)] = 0
return s[start:end+1]
Я получаю следующую ошибку при вводе «aaabaa» в функцию: KeyError:(4, 1)
Когда я делаю следующие изменения, он выводит правильно
def longestPalindrome(s: str) -> str:
dict = {}
start = 0
end = 0
# initialize base cases and left of base cases
for i in range(len(s)):
dict[(i,i)] = 1
for y in range(len(s), -1, -1):
for x in range(y, len(s)):
print((x,y))
# memo check
if (x, y) not in dict.keys():
dict[(x,y)] = 0 # **CHANGE**
if s[x] == s[y]:
if x - y == 1:
dict[(x,y)] = 1
if (end - start) <= (x-y):
start = y
end = x
elif dict[(x-1,y+1)] == 1: # if substr betweet x & y is palindrome
dict[(x,y)] = 1
if (end - start) <= (x-y):
start = y
end = x
# else: # **REMOVE**
# dict[(x,y)] = 0
return s[start:end+1]
Я почти уверен, что две версии функций логически совпадают, ноЯ не могу понять, почему первый не работает.