三、Leetcode算法最长回文子串

1、题目

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

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

2、分析

题目要求去找最长的回文子串,回文子串即从前面读与从后面读是一致的,所以当时想到使用切片去find,找到符合top和end字符,然后判断从前读与从后读是否一致,唯一感觉不好就是使用for循环,时间复杂度可能会比较高。

3、代码

class Solution:
    def longestPalindrome(self, s: str) -> str:
        max_length = ''
        l = len(s)
        ss = s        # 接下来要进行切片,必须保持始终从最原始的数据切片
        for x in range(l):
            index = 0
            s = ss[x:]
            while index != -1:   # 没有找到会返回 -1 
                index = s.find(s[0], index, len(s))   # 定义开始位置,结束位置
                if s[:index+1] == s[index::-1] and len(s[:index+1]) > len(max_length):
                    max_length = s[:index+1]
                
                if index != -1:
                    index += 1

        return ss if len(ss) == 1 else max_length

4、结果

执行用时 :6372 ms, 在所有 python3 提交中击败了6.22% 的用户
内存消耗 :12.8 MB, 在所有 python3 提交中击败了99.17%的用户

5、改进

看结果发现果然时间复杂度比较高,但是感觉for循环遍历是不能避免的,所以时间复杂度的优化,只能是for循环内的查找方法的优化。


望您:
“情深不寿,强极则辱,谦谦君子,温润如玉”。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值