最长回文子串

leetcode题目

在这里插入图片描述

分析

两个指针从候选回文子串的中点开始向两边扩散
在这里插入图片描述
有两种情况:回文子串长度为奇数,中点指向一个字符。长度为偶数,中点指向两个字符中间。
1.中点指向一个字符
2.中点指向两个字符中间
在这里插入图片描述

package com.company.test1;

public class Test5 {
    public static void main(String[] args) {
        String s="ac";

//        中点指的是回文子串的中点
//        有两种情况:回文子串长度为奇数,中点指向一个字符。长度为偶数,中点指向两个字符中间。
//        1.中点指向一个字符
        int max=0;
        int begin=0,end=0;
        int maxBegin=0,maxEnd=0;
        char[] arr = s.toCharArray();

        if(arr.length==1){
            System.out.println(s);
        }else if(s.length()==2){
            if(arr[0]==arr[1]){
                System.out.println(s);
            }else{
                System.out.println(arr[0]+"");
            }
        }
        for (int i = 1; i < arr.length-1; i++) {
            int len=1;
            int j=1;
            for ( ; i+j<arr.length&&i-j>=0; j++) {
                if(arr[i-j]==arr[i+j]){
                    len+=2;
                }else{


                    break;
                }
            }
            System.out.println((i-j+1)+","+(i+j-1));
            System.out.println("------------");
//            System.out.println(len);
            if(len>max){
                max=len;
                maxBegin=i-j+1;
                maxEnd=i+j-1;
            }
        }
//        System.out.println(arr[maxBegin]+","+arr[maxEnd]);
        System.out.println(maxBegin+","+maxEnd);

//        2.中点指向两个字符中间
//        double i=3.5;
        for (double i = 0.5; i <arr.length-1 ; i++) {
            System.out.println(i);
            int len=1;
            double j = 0.5;
            for (; i+j<arr.length&&i-j>=0 ; j++) {

                System.out.println(arr[(int)(i-j)]+","+arr[(int)(i+j)]);
                if(arr[(int)(i-j)]==arr[(int)(i+j)]){
                    len+=2;
                }else{

                    break;
                }

            }
            if(len>max){
                max=len;
                maxBegin=(int)(i-j)+1;
                maxEnd=(int)(i+j)-1;
            }
        }
        System.out.println(arr[maxBegin]+","+arr[maxEnd]);
        StringBuilder builder=new StringBuilder();
        for (int i = maxBegin; i <=maxEnd ; i++) {
            builder.append(arr[i]);
        }
        System.out.println(builder.toString());
        System.out.println(maxBegin+","+maxEnd);



    }
}

先在b站上学习算法入门视频,然后再做此类题目会更加容易。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值