力扣刷题(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