回文子串

发布时间 2023-07-11 00:24:46作者: 狼太白

 

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

 

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:

输入:s = "cbbd"
输出:"bb"

作者:LeetCode
链接:https://leetcode.cn/leetbook/read/array-and-string/conm7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        ans_len = 1 #回文子串长度初始值
        #中心扩展算法
        #从每一个位置mid出发,向两边扩散
        maxLeft = 0 #记录最长回文子串的起点
        maxRight = 0 #记录最长回文子串的终点
        maxLen = 0  #记录最长回文子串的长度
        for mid in range(len(s)):
            left = mid - 1
            right = mid + 1
            #向左侧扩展,直到超过边界或遇到与中心字符不等跳出while循环
           while(left >= 0 and s[left] == s[mid]):
                left = left - 1
               
               00
            #向右侧扩展,直到超过边界或遇到与中心字符不等跳出while循环
            while(right < len(s) and s[right] == s[mid]):
                right = right + 1
                ans_len = ans_len + 1
            #同时向左右两侧扩展
            while(left >= 0 and right < len(s) and s[left] == s[right]):
                left = left - 1
                right = right + 1
                ans_len = ans_len + 2

            if (ans_len > maxLen): #比较每次回文长度
                maxLen = ans_len
                maxLeft = left
                maxRight = right
            
            ans_len = 1 #because maxlen record longestPalindrome length,so need restore to initial value after each loop
        
        return s[maxLeft+1:maxRight]