class Solution:
    def longestPalindrome(self, s: str) -> str:
        """
        main idea: from middle to two ends , two cases: 1. odd  2. even
        time O(N^2) space O(1)
        """
        res = ''  # Memory to remember a palindrome
        for i in range(len(s)):
            # even 
            temp = self.helper(s,i,i+1)
            # get the longer palindrome after each expansion
            if len(res)<len(temp):
                res = temp
            # odd
            temp = self.helper(s,i,i)
            if len(res) < len(temp):
                res = temp
        return res
            
    def helper(self,s,l,r):
        # check l,r are within valid range, expand two ends
        while l >= 0 and r < len(s) and s[l]==s[r]:
            l -= 1
            r += 1
        # return expended string(be careful with out of boundry)
        return s[l+1:r]