力扣(LeetCode) 5.最长回文子串(java)

该文章介绍了一个Java程序,用于解决在给定字符串中找到最长回文子串的问题。程序采用了中间扩散的策略,首先检查字符串的中心,然后向两侧扩展,以找到可能的回文子串。代码在LeetCode上进行了测试,并提供了详细的逻辑解析。
摘要由CSDN通过智能技术生成

题目

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

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

方法一:中间扩散

public class LongestPalindrome {

    public int maxLen = 0;
    public int begin = 0;

    public static void main(String[] args) {
        String s = "adam";
        System.out.println(new LongestPalindrome().longestPalindrome(s));
    }

    public String longestPalindrome(String s) {

        char[] chars = s.toCharArray();
        int lens = chars.length;
        if (lens<2) {
            return s;
        }

        deal(chars, lens/2, 0);
        return s.substring(begin, begin+maxLen);
    }

    private void deal(char[] chars, int k, int flag) {

        int leng = chars.length;
        int l = k-1;
        int r = k+1;
        //解决奇偶
        while (l>=0 && chars[l]==chars[k]) {
            l--;
        }
        while (r<leng && chars[r]==chars[k]) {
            r++;
        }
        //中心扩展
        int ll = l;
        int rr = r;

        while (ll>=0 && rr<leng && chars[ll] == chars[rr]) {
            ll--;
            rr++;
        }

        if (rr-ll-1>maxLen) {
            maxLen = rr-ll-1;
            begin = ll+1;
        }

        if (flag>=0 && (leng-r-1)*2>maxLen) {
            deal(chars, r, 1);
        }

        if (flag<=0 && (l+1)*2>maxLen) {
            deal(chars, l,-1);
        }
    }

}

LeetCode测试结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值