Contact
Back to Home

Would you be able to compose a routine to search for the longest palindrome in a string?

Featured Answer

Question Analysis

The question asks you to write a routine (a function or method) that finds the longest palindrome within a given string. A palindrome is a sequence of characters that reads the same forward and backward (e.g., "racecar" or "level"). The challenge here is to efficiently identify the longest contiguous substring that forms a palindrome from the input string.

Key points to consider:

  • The input is a single string.
  • The output should be the longest palindromic substring.
  • Edge cases may include strings with no palindromes longer than one character, or strings where the entire string is a palindrome.

Answer

To solve this problem, you can use a dynamic programming approach or an expand-around-center approach. Here, I will describe the expand-around-center approach, which is intuitive and has an O(n^2) time complexity.

def longest_palindrome(s: str) -> str:
    def expand_around_center(left: int, right: int) -> str:
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
        # Return the palindrome substring
        return s[left + 1:right]

    if len(s) < 2 or s == s[::-1]:
        return s

    longest = ""
    for i in range(len(s) - 1):
        # Odd length palindrome
        palindrome1 = expand_around_center(i, i)
        # Even length palindrome
        palindrome2 = expand_around_center(i, i + 1)

        # Update longest palindrome found
        longest = max(longest, palindrome1, palindrome2, key=len)

    return longest

# Example usage
s = "babad"
print(longest_palindrome(s))  # Output: "bab" or "aba"

Explanation:

  • The function expand_around_center is a helper function that expands outwards from a chosen center and checks for palindromes by comparing characters symmetrically.
  • The main function iterates through each character in the string, treating each as a center for potential palindromes of both odd and even lengths.
  • It then updates the longest palindrome found using the max function with the key=len to compare the lengths of the palindromic substrings.
  • Edge cases are handled by checking if the string is already a palindrome or if it is too short to require checking.

This approach efficiently finds the longest palindromic substring by exploring potential centers and expanding outwards, ensuring all possible cases are covered.