Search code examples
pythonlistpalindrome

Saving longest list in Python


I am correctly printing every palindromic substring of my input string. Then I return the final palindromic substring which is ["?"]. Makes perfect sense.

def longestPalindrome(s):
    longest = []
    palindrome = []
    for i in range(len(s)):
        for j in range(i, len(s)):
            palindrome.append(s[j])
            if palindrome == palindrome[::-1]:
                print(palindrome)
                longest = palindrome
        palindrome = []
    return longest

print(longestPalindrome("What kind of racecar do you drive?"))

I try to get only the longest palindrome by changing the if statement like this.

if palindrome == palindrome[::-1] and len(palindrome) > len(longest):

This is not working as expected. I'm only printing the first palindrome ["W"] then returning the entire string in a list ["W", "h", ...]


Solution

  • When you do longest = palindrome, you're pointing the reference of the longest list at palindrome, and therefore palindrome.append(s[j]) is also appending to longest

    You need to copy the list.

    longest = palindrome[:]
    

    For example,

    def longestPalindrome(s):
        longest = []
        palindrome = []
        for i in range(len(s)):
            for j in range(i, len(s)):
                palindrome.append(s[j])
                if palindrome == palindrome[::-1] and len(palindrome) > len(longest):
                    # print(palindrome, i, j)
                    longest = palindrome[:]
            palindrome = []
        return ''.join(longest)
    
    print(repr(longestPalindrome("What kind of racecar do you drive?")))
    

    Your function should return ' racecar ' with your "fix" then.

    Or you can simply use strings instead of lists.