寻找最长回文数

该博客探讨如何找到给定字符串的最长回文子串,介绍中心扩展算法和动态规划等解决策略,例如在字符串"aabcdcb"中发现"bcdcb",在"bananas"中找到"anana"。
摘要由CSDN通过智能技术生成

问题

给定一个字符串,找到最长的回文连续子字符串。如果不止一个,则返回一个即可。例如,“aabcdcb”的最长回文子串是“bcdcb”。 “bananas”的最长回文子串是“anana”。

中心扩展算法

 public static String longestPalindrome(String s) {
   
        if (s == null || s.length() < 1) {
   
            return "";
        }

        int start = 0;
        int end = 0;
        for (int i = 0; i < s.length(); i++) {
   
            // 精髓在于此,len1,i与i比较,对应于奇数个数,中心对应i这个数,向两边扩散。aca
            // len2,以此类推,对应于偶数个数,中心对应i和i+1中间的空格,相当于已经扩散了一次,已经在i和i+1上,向两边扩散。fddf
            int len1 = expandAroundCenter(s, i, i); // 检测长度为奇数的子串, 例如aba
            int len2 = expandAroundCenter(s, i, i + 1); // 检测长度为偶数的子串, 例如abba
            int len = Math.max(len1, len2);
            if (len > end - start) {
   
                // 假设回文串长度为奇数,start与i之间的距离为(2n+1)/2;
                // 假设回文串长度为偶数,start与i的距离为(2n)/2-1;
                // 而在整数除法里,(2n)/2-1与(2n-1)/2是相等的;(2n+1)/2与(2n)/2的结果是相等的;
                // 于是start与i之间的距离得以统一;对于end来说,分析是一致的
                start = i - (len - 1) / 2; // 扩展后, 以i为中心,左指针前移一半长度
                end = i + len / 2; // 扩展后, 以i为中心,右指针后移一半长度
            }
        }

        return s.substring(start, end + 1);
    }

    public static int expandAroundCenter(String s, int left, int right) {
   
        //left:相当于指向中间位置的第一位;
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值