Python: простое выражение If-Else не работает - PullRequest
0 голосов
/ 27 октября 2019

Я кодирую функцию динамического программирования, которая находит самую длинную подстроку, которая является палиндромом в 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]

Я почти уверен, что две версии функций логически совпадают, ноЯ не могу понять, почему первый не работает.

1 Ответ

0 голосов
/ 27 октября 2019

Вы намеревались вернуть else ширину одной вкладки назад? Ваш else должен соответствовать шагу напоминания. Это соответствует if s[x] == s[y]:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...