5. 最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad” 输出: “bab” 注意: “aba” 也是一个有效答案。 示例 2:

输入: “cbbd” 输出: “bb”

暴力

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        size = len(s)
        if size < 1:
            return s

        max_len = 1
        res = s[0]

        for i in range(size-1):
            for j in range(i+1, size):
                if  j - i + 1  > max_len and self.is_valid(s, i, j):
                    max_len =  j - i + 1
                    res = s[i:j+1]
        return res

    def is_valid(self, s, left, right):
        while left < right:
            if s[left] != s[right]:
                return False
            left += 1
            right -= 1
        return True
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        size = len(s)
        if size < 1:
            return s

        max_len = 1
        res = s[0]

        for i in range(size):
            odd, odd_len = self.spread_from_center(s, i, i)
            even, even_len = self.spread_from_center(s, i, i+1)
            max_sub = odd if odd_len > even_len else even
            if len(max_sub) > max_len:
                max_len = len(max_sub)
                res = max_sub
        return res

    def spread_from_center(self, s, left, right):
        if not s or left > right:
            return '', 0
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
        return s[left+1:right], right - left - 1