【Leetcode】最长回文子串 @ systemime | 2022-01-28T00:09:38+08:00 | 2 分钟阅读 | 更新于 2022-01-28T00:09:38+08:00

描述

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。

示例 2:

输入:s = “cbbd”
输出:“bb”

示例 3:

输入:s = “a”
输出:“a”

示例 4:

输入:s = “ac”
输出:“a”

提示:

1 <= s.length <= 1000 s 仅由数字和英文字母(大写和/或小写)组成

Related Topics

  • 字符串
  • 动态规划

👍 4626
👎 0

题解

python

复杂度n^2(调用了find方法,其实算n^3),慢,准备再优化

"""
3:56 PM	info
		解答成功:
		执行耗时:780 ms,击败了71.07% 的Python3用户
		内存消耗:14.9 MB,击败了96.09% 的Python3用户
"""
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """

        max_str = ""
        max_len = 0
        break_idx = 0
        all_len = len(s)
        for idx, val in enumerate(s):

            p_idx = idx
            t_idx = s.find(val, p_idx + 1)  # 核心思路是暴力获取每个位置挨个区间内查找

            while t_idx > 0:
                t_len = t_idx + 1 - idx
                if t_len == 2 and t_len > max_len:
                    max_str = s[idx: t_idx+1]
                    break_idx = all_len - t_len
                    max_len = t_idx + 1 - idx
                elif t_len > max_len:
                    t_str = s[idx: t_idx+1]
                    if t_str == t_str[::-1]:
                        max_str = t_str
                        max_len = t_idx + 1 - idx
                        break_idx = all_len - t_len
                t_idx = s.find(val, t_idx + 1)

            if t_idx < 0 and not max_str:
                max_str = val
                break_idx = all_len - 1
                continue

            if idx == break_idx:
                break

        return max_str

先排出空字符串、单个字符、整个串都是回文的情况,再对每次移动指针,每次扫描指针及前两个字符(有一个字符是中心点)和指针前一个字符(两个字符是中心)的情况,然后从中心开始指针每次向后移动一个字符,相当于检查中心+两边各一个字符的是否是回文,逐步扩大扫描

"""
3:32 PM	info
		解答成功:
		执行耗时:52 ms,击败了99.76% 的Python3用户
		内存消耗:15.2 MB,击败了51.69% 的Python3用户
"""

class Solution:
    def longestPalindrome(self, s: str):

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

        res = s[0]
        maxlen = 1

        for i in range(1, len(s)):
            odd = s[i - maxlen - 1: i + 1]  # 一个字符中心
            even = s[i - maxlen: i + 1]  # 两个字符中心
            if odd and odd == odd[::-1]:
                res = odd
                maxlen += 2
                continue
            if even == even[::-1]:
                res = even
                maxlen += 1
                continue
        return res

© 2018 - 2022 systemime 的博客

Powered by Hugo with theme Dream.

---

avatar
关于我

systemime 的博客

记录一些生活与技术的事或思考

毕业于 🏫 山东科技大学泰山科技学院

目前职位为Python后端开发工程师

热爱代码,热爱开源

主要的技术栈是:

  • python
  • celery
  • django
  • shell
  • sql
  • go
  • nginx

爱好

  • 羽毛球
  • 编码
我的一些开源项目

计划或项目:

  • skill_test ➡️ 一个包含项目常用的django模板:常用脚本、单测方法、数据库连接池、异步请求池,restful风格的回调接口管理器 60%
  • Vbox ➡️ 一个基于k8s和docker的容器云平台,早期项目代码较简单 90%
  • YuQue-Assistant ➡️ 用于批量拉取语雀工作区文章,使用进程池+协程
  • 一个代理池 60%
  • simple_db_pool ➡️ 一个简单数据库连接池 100%
  • 一个电报消息转发脚本 90%
  • 使用flutter做一个app 计划中
  • 其他若干脚本(bilibili、微博图片视频下载、文件对比、图片颜色提取…)
其他

如果你喜欢我的博客、开源项目或者它们可以给你带来帮助,可以赏一杯咖啡 ☕ 给我。~

If you like my open source projects or they can help you. You can buy me a coffee ☕.~

PayPal

https://paypal.me/systemime

支付宝赞赏码

alipay

微信赞赏码

wechat

最好附加一下信息或者留言,方便我可以将捐助记录 📝 下来,十分感谢 🙏。

It is better to attach some information or leave a message so that I can record the donation 📝, thank you very much 🙏.