LeetCode(cai鸟之路)05最长回文子串(暴力解法-两边聚合)

题目表述

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

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

先上代码

public class Solution5 {



    public static void main(String[] args) {

        System.out.println(longestPalindrome("ccccc"));
    }
    public static String longestPalindrome(String s) {

        int len = s.length();


        if(len<2){
            return s;
        }
        int maxLen = 1;
        int begin = 0;
        char[] chars = s.toCharArray();
        for(int i = 0;i<len -1;i++){

            for (int j = i+1;j<len;j++){

                if(j-i+1>maxLen &&isTrue(chars,i,j) ){

                    maxLen = j -i +1;
                    begin = i;
                }
            }
        }
        return s.substring(begin,begin+maxLen);


    }

    public static  boolean isTrue(char[] chars,int left,int right){

        while (left<right){
            if(chars[left] != chars[right]){
                return false;
            }
            left++;
            right--;
        }
        return true;



    }


}

分析:

寻找最长回文子串,可以采用暴力的手法去解决。
先考虑字符长度很小的情况,当输入的字符串的长度小于2的时候,直接返回字符串本身。
当字符串的长度大于1的时候,需要对其扫描遍历求解。
定义扫描的范围 i 和 j。i从起始位置开始,到最后一个位置的前一位结束,j从i的下一位到字符串结尾结束(要保证扫描的长度要大于1)。
关键理解的地方: 我们在寻找和截取字符串的时候,可以记录其起始位置和长度,就可以直接拿到那个子字符串。
所以我们预先定义长度为1,起始位置为0。

  • 先用字符串的toCharArray()方法转化为字符数组,方便遍历扫描。
  • 然后就是两个for循环扫描。最里面需要判断当前扫描到的字符串是否为回文子串,并且目前扫描到的长度是否大于maxLen里面保存的值。如果成立,就对maxLen进行更新,保存回文子串的开始位置。( 我们在寻找和截取字符串的时候,可以记录其起始位置和长度,就可以直接拿到那个子字符串。
  • 写一个判断是否为回文子串的函数,参数为之前转换的字符数组,传入进行判断的起始位置。然后从两端向中间扫描比较,如果出现不等的情况,就直接返回false,否则,两端同时向中间移动继续比较。

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值