Leetcode 5. 最长回文子串

149 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、题目描述

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

二、思路分析

  • 首先回文子串的概念讲一下,就是两边是对称的(举个例子:上海自来来自海上),左右是对称的吧!
    • Leetcode 4. 寻找两个正序数组的中位数一样也需要考虑字符串长度的奇数和偶数的情况。
    • 长度为奇数,从中间的数向两边扩散
    • 长度为偶数,需要从中间的两个数即第i个字符i-1个字符向两边扩散

三、AC 代码:

class Solution {
    //记录下标,用于截取回文子串返回
    int [] range = new int[2];
    public String longestPalindrome(String s) {
        int n = s.length();
        //长度为0或1的时候返回本身
        if(n == 0||n == 1){
            return s;
        }
        //将字符串转换为字符数组节省时间
        char[]ss = s.toCharArray();
        //i从1开始,因为只有1位的话本身就是回文串
        for(int i = 1;i<n;i++){
            //奇数的情况
            helper(ss,n,i,i);
            //偶数的情况
            helper(ss,n,i-1,i);
        }
        //切割返回回文串
        return s.substring(range[0],range[1]);
    }

    public void helper(char[]ss,int n,int start,int end){
        //退出条件不能数组越界
        while(start>=0&&end<=n-1)
        if(ss[start] == ss[end]){
            start --;
            end ++;
        }else{
            break;
        }
        //如果当前长度比存储的长度大,则更新存储数组为最新的长度
        if(end - (start+1)>range[1] - range[0]){
            range[0]=start+1;
            range[1] = end;
        }

    }
  
}


四、总结:

  • 好了,代码撸完,我们总结一下
    • 这道题其实有两种解法,其一是本文所记录的中心扩散法,其二是动态规划,后面会写
    • 要注意字符串长度奇数偶数两种不同的情况
    • 细节,要注意不包含start,所以start需要减一,substring函数截取是不包含最后一位的所以end不需要减

最后这个算法是Leetcode的第五题,也是热题100的第五题,去年我刷了热题100用时一个月左右,接下来我会继续更新,小伙伴可以点一下关注,如果你也在刷热题100的话,希望可以对你有一些启发!