最长回文子串

题目:最长回文子串

问题描述:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

解决思路:

本题可以采用中心扩展算法:顾名思义,由于回文串具有中心对称的性质,所以我们可以根据字符串中的某一个字符开始分别向左向右扩展,直到找到不相等的字符为止,这样得到的字符串即是能够得到的最长回文串。

我们应该注意,当回文串的长度是偶数时,中心有n-1个;而当回文串的长度是奇数时,中心就有n个(n为回文串的长度):

解决代码:


class Solution {
    public static String longestPalindrome(String s) {
        if (s.length() < 2) {
            return s;
        }

        // 最长回文子串长度
        int maxLen = 0;
        // 回文子串中心
        int center = 0;
        for (int i = 0; i < s.length(); i++){
            // 最长回文串长度为奇数
            int begin = centerExpand(s, i, i);
            // 最长回文串长度为偶数
            int end = centerExpand(s, i, i + 1);

            if (maxLen < Math.max(begin, end)){
                center = i;
                maxLen = Math.max(begin, end);
            }
        }
        // 如果回文子串的长度为偶数,那么中心左边的长度会比右边的长度小1
        return s.substring(center - (maxLen - 1) / 2, center + maxLen / 2 + 1);
    }

    private static int centerExpand(String s, int begin, int end){
        while (begin >= 0 && end < s.length() && s.charAt(begin) == s.charAt(end)){
            begin--;
            end++;
        }
        // 返回以begin和end为基准,同时向左向右扩展后能够得到的最长回文串长度
        return end - begin - 1;
    }
}
posted @ 2020-07-05 11:29  samsaraaa  阅读(107)  评论(0编辑  收藏  举报