LeetCode-5.最长回文子串——又见双指针

题目:最长回文子串

思路🤔——还是双指针

回文序列,那就是正着反着读一样。所以很容易想到双指针夹逼的方法

 

  • 指定指针p从字符串前端开始循环,同时指定指针q从字符串后端开始循环(往前走,一次一步),q每走完全程(遇到p)或得到了答案,则p前进一步,q再从末尾开始循环;
  • 当p、q双指针指向的字符一致时,查看[p:q+1]的子串,正读、反读是否一致:
    •  若一致,则和当前回文子串比长度,留更长的那个。然后break内从的q指针循环(因为q越循环子串越短,后面的没必要再查)
    • 若不一致,那就pass咯
  • 此外,在q每次开始循环的时候先检查一下剩余子串和回文序列哪个更长。若回文序列更长,那么也没必要再查了,直接break

 Code:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        if len(s) < 2:
            return s
        huiwen = s[0]
        for p in range(0, len(s), 1):
            for q in range(len(s)-1, p, -1):  # 倒着循环,效率更高(注意end是取不到的)
                if len(huiwen) > q-p+1:  # 若当前回文序列比可能最长的序列还长,就别查了
                    break
                if s[p] == s[q]:
                    sub = s[p:q+1]   # 切片末位取不到
                    if sub == sub[::-1]:
                        huiwen = sub if len(sub) > len(huiwen) else huiwen # 谁长留下谁
                        break  # break内层q的循环
        return huiwen 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_illusion_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值