最长回文子串

目录

题目

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

思路

一开始见到这个题目,我一想到的就是暴力法,直接遍历,然后寻找,大概的思路就是先确定哪一部分是最长的回文子串,拿到它的下标,然后,就是利用下标去切割字符串,返回结果,最难的部分,当然是确定下标。

确定下标

  1. 如果这个字符串的长度是一位,直接返回
  2. 大于两位的,利用循环开始一 一的遍历,初始化认为最长的回文子串,字母之间的下标差为1,就像"aa"这个字符串一样,下标差为1。
    遍历的思路是这样的:第一轮循环:下标是0的跟下标是1的比较,下标是1的跟下标是2的比,直到倒数第二和倒数第一比,然后利用一个数组来记录它们的比较结果,第二轮是下标是0和下标是2的相比,。。。以此类推,每轮都记录谁是回文子串,记录最大的下标差

切割字符串

全部的循环完之后,我们就可以得出最大的下标差了,利用这个下标差去切割字符串,就可以得出最大的回文字符串。

代码如下

    public String longestPalindrome(String s) {
        if(s.length() == 1 || s == null) return s;
        int len = s.length();
        boolean[][] array= new boolean[len][len];
        for(int i = 0;i < len;i++){
            array[i][i] = true;
        }
        int maxlen = 1;
        int begin = 0;
         char[] ch = s.toCharArray();
        for(int L = 2;L <=len;L++){
            for(int i = 0;i < len;i++){
                int r = L + i -1;
                if(r >=len) break;
                if(ch[i] != ch[r]){
                    array[i][r] = false;
                }else{
                    if(r - i < 3){
                        array[i][r] = true;
                    }else{
                        array[i][r] = array[i + 1][r - 1];
                    }
                }

                if(array[i][r] && (r -i + 1) > maxlen){
                    maxlen = r - i + 1;
                    begin = i;
                }
            }
        }
        
        
        return s.substring(begin, begin + maxlen);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值