最长回文子串python_最长回文子串(Python)

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

示例 1:

输入: "babad"

输出: "bab"

注意: "aba"也是一个有效答案。

示例 2:

输入: "cbbd"

输出: "bb"

思考这个问题第一是从List两边考虑,先找到两个相同的点, 然后各像中心移动1步。这个方法被PASS的原因是遇到输入“aaabaaaa”时,两边同时移动则只能返回“aaaa”

第二次从回文子串的中心考虑,先假设List中每一个点ii都有回文子串,接下来验证l[ii-1]和 l[ii+1]是否相同,如果相同就继续验证l[ii-2]和 l[ii+2]。对比所有结果,返回最大的子串。

class Solution:

def longestPalindrome(self, s):

""":type s: str:rtype: str"""

l=list(s)

length = len(l)

if length == 0:

return ""

if length == 1:

return s

temp=[]

result = []

i = 0

ii = 0

j = 1

flag = True

while ii < length:

i = ii - 1

j = ii + 1

while j < length and l[ii] == l[j]:

j = j + 1

temp = l[ii:j]

while (i>=0 and j<=length-1 and l[i] == l[j]):

temp = l[i:j+1]

i = i - 1

j = j + 1

if len(temp) > len(result):

result = temp

ii = ii + 1

if len(result) == 0:

return l[0]

return "".join(result)

时间复杂度是O(n^2),不知道是不是算错了,因为结果此方法速度在最后10%中。

这里提供一个大神的O(n)解法,用到了倒叙list对比。

class Solution:

def longestPalindrome(self, s):

"""

:type s: str

:rtype: str

"""

# 如果字符串长度小于2或者s等于它的倒序,则直接返回s

if len(s) < 2 or s == s[::-1]:

return s

n = len(s)

# 定义起始索引和最大回文串长度,odd奇,even偶

start, maxlen = 0, 1

# 因为i=0的话必然是不可能会有超过maxlen情况出现,所以直接从1开始

for i in range(1, n):

# 取i及i前面的maxlen+2个字符

odd = s[i - maxlen - 1:i + 1] # len(odd)=maxlen+2

# 取i及i前面的maxlen+1个字符

even = s[i - maxlen:i + 1] # len(even)=maxlen+1

if i - maxlen - 1 >= 0 and odd == odd[::-1]:

start = i - maxlen - 1

maxlen += 2

continue

if i - maxlen >= 0 and even == even[::-1]:

start = i - maxlen

maxlen += 1

return s[start:start + maxlen]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值