Bootstrap

力扣刷题(python)50天——第三天:最长回文子串

力扣刷题(python)50天——第三天:最长回文子串

题目描述

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

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

示例 2:
输入: “cbbd”
输出: “bb”

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法

我们知道回文字符串都有一个中心对称点,该点既可以是某个字符,也可以存在于两个字符之间。因此一共有2n-3个这样的点,我们对每个点分别向两侧进行检测是否回文,并记录下最长的回文字符串。

解答

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        if s=='':
            return s
        length=len(s)
        rec=1
        str_long=s[0]
        for i in range(2*length-3):
            flag2=False
            if i%2:
                flag=1
                mid=(i+1)//2
                while True:
                    try:
                        if s[mid-flag]==s[mid+flag] and mid - flag>=0:
                            flag+=1
                            flag2=True
                        else:
                            if rec<=2*(flag-1)+1 and flag2:
                                str_long=s[mid-flag+1:mid+flag]
                                rec=len(str_long)
                            break
                    except:
                        if rec<=2*(flag-1)+1 and flag2:
                            str_long=s[mid-flag+1:mid+flag]
                            rec=len(str_long)
                        break
            else:
                flag=0
                mid_l=i//2
                mid_r=mid_l+1
                while True:
                    try:
                        if s[mid_l-flag]==s[mid_r+flag] and mid_l-flag>=0:
                            flag+=1
                            flag2=True
                        else:
                            if rec<=2*flag and flag2:
                                str_long=s[mid_l-flag+1:mid_r+flag]
                                rec=len(str_long)
                            break
                    except:
                        if rec<=2*flag and flag2:
                            str_long=s[mid_l-flag+1:mid_r+flag]
                            rec=len(str_long)
                        break
        return str_long

心得

1.本题是第一次没有查任何资料就靠自己做出来了的题,很有成就感QAQ。
2.找回文字符串重点需要观察回文字符串的特点,即是对称的。故联想到对称中心。
3与上一道题结合,本题我也试过添加#的方法,也可以帮助理解

执行结果

时间复杂度为O(n^2)

参考资料:

时间复杂度为O(n)的马拉松算法:
https://www.jianshu.com/p/116aa58b7d81

;