I have encountered to this question and applied a brute force algorithm off top of my head and couldn't find a better optimized solution. I was hoping I could get some insight to implement a better optimized code in terms of complexity. My solution has O(N2) as well as O(n2) space. class Solution: def longestPalindrome(self, s: 'str') -> 'str': if s=="": return "" else: ## Find all the substrings arr=[] for i in range(len(s)): char = s[i] arr.append(char) for j in range(i+1, len(s)-1): char+=s[j] arr.append(char) ##Find the palindrome with a longest length max_length = 0 for j in range(len(arr)): if self.isPalindrome(arr[j]): if len(arr[j]) > max_length: max_length = len(arr[j]) index = arr[j] return index def isPalindrome(self,s:'str')->'str': if s == s[::-1]: return True