链接: 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
输入: "cbbd"
输出: "bb"
代码:
方法一:
class Solution:
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        start = end = 0
        for i in range(len(s)):                   # 遍历s,以每个字符为中心向两边扩散
            len1 = self.centerexpand(s, i, i)     # 回文串长度为奇数,aba
            len2 = self.centerexpand(s, i, i+1)   # 回文串长度为偶数,abba
            maxlen = max(len1, len2)              
            if maxlen > end - start + 1:          # 判断是否是最长的一个回文子串
                start = i - (maxlen - 1)//2
                end = i + maxlen//2
        return s[start: end+1]                    # eg: s[0:1]输出s[0]
                
    def centerexpand(self,s,l,r):
        while l >= 0 and r < len(s) and s[l] == s[r]:
            l -= 1
            r += 1
        return r - l - 1        #返回子串长度
方法二:
class Solution:
    def longestPalindrome(self, s: str) -> str:
        if s == "": 
            return s
        dic = {}
        loc = [0, 0]
        ans = s[0]
        for i in range(len(s)):
            if s[i] in dic:
                keys = dic.get(s[i])
                for j in range(len(keys)):
                    start = keys[j]
                    if (i - start) > (loc[1] - loc[0]):
                        temp = s[start : i + 1]
                        if temp == temp[ : : -1]:
                            loc = [start, i]
                            break;
            dic.setdefault(s[i], []).append(i)
        return s[loc[0] : loc[1] + 1]