算法题也刷了很多,正儿八经去仔细思考回文的题目,这还是第一道。
给定一个字符串
s
,找到s
中最长的回文子串。你可以假设s
的最大长度为 1000。示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。示例 2:
输入: "cbbd" 输出: "bb"
自己思考的比较简单,最初想的就是暴力解题法,对回文子串的长度判断只做了一个简单的判定,没有更多详细的思考(函数1)。后来发现运行超时,有一个测试用例始终过不了,是一个重复子串的考虑,就又写了一个函数来专门做这个,附上代码(4992ms)
class Solution: def longestPalindrome(self, s): if len(s)<2: return s b = list(s) lenmax,maxstr = self.getLreply(s) for i in s: index = b.index(i) c=''.join(b) #print(c) for j in range(lenmax,len(c)): d=c[:j+1] #print(d,d[::-1]) if d==d[::-1]: if len(maxstr)<len(d): maxstr=d lenmax=len(maxstr) b.pop(index) return maxstr def getLreply(self,s): count=1 maxc=0 cs=s[0] tem='' for i in range(1,len(s)): if s[i]==s[i-1]: count+=1 cs+=s[i] else: if count>maxc: maxc =count tem=cs cs=s[i] count=1 # print(count,cs) return maxc,tem
自己的想法比较简单,是通过暴力解题的方法,只是依靠maxlen对后面回文子串的长度比对做了一些限制,整体时间复杂度O(n2),空间复杂度O(1)。看到官网题解有动态规划和马拉车算法进行的优化,貌似马拉车算法优化效率很高,明天准备再仔细研究一下,现在有点晚了。明天继续更新吧~