leetcode 5: 最长回文子串(中心扩展算法)

本文介绍了如何通过中心扩展算法解决LeetCode中的第5题——找到给定字符串中最长的回文子串。算法以每个字符为中心,向两侧扩展,检查回文特性,避免了字符串反转,从而达到较高的效率。虽然时间复杂度为O(n^2),但相比其他复杂度更低的Manacher算法,中心扩展算法更易于理解。题解还强调了回文串的奇偶长度中心选取和边界条件处理的重要性。
摘要由CSDN通过智能技术生成

题解

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

  • 题解:虽然长度是1000,但是如果暴力求每个子串的翻转来判断,那似乎是O(n^3)的复杂度,因此不可取。

    • 个人认为中心扩展算法是解决最长回文子串问题的最容易掌握的方法,这种算法时间复杂度是O(n^2),空间复杂度是O(1)(但是不是复杂度最优的算法,最优的算法是Manacher算法,时空复杂度都是O(n),但是比较复杂,需要经常看才能掌握)
    • 中心扩展算法:巧妙的利用了回文串的特点,就是从中心到两边扩展的过程中,两边的字符应该保持一样,比如abcba,从c向左和向右扩展的过程中,两边字符是一样的,这样一来,我们就不需要将字符串进行反转,只需要遍历整个字符串,对每个字符都进行一次中心扩展判断,然后找出最长回文字串即可
    • 中心选取:回文串可能是奇数长度,也可能是偶数长度,对于两者而言,中心的位置是不同的,奇数是n/2,如aba的中心就是b,偶数是(n/2-1,n/2)两个点,如abba的中心就是bb,这样一来,算法就变成,对于每个i,都判断一下以i为中心扩展的回文串,和以(i,i+1)为中心扩展的回文串即可
  • 实现:注意边界条件

class Solution {
   
    public List<Integer> pos(String s, int n, int l, int r){
   
        while(l >= 0 && r< n){
   
            if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值