算法精讲-leetcode5-最长回文子串-扩展中心解法

最长回文子串

    • 题目描述
    • 解题思路
    • 代码示例
    • 运行结果

题目描述

 给定一个字符串 str,找到 str 中最长的回文子串。
 例如:“ababcbae”的最长回文子串是“abcba”

解题思路

  • 扩展中心解法:遍历整个字符串,将每个字符和字符的间隔作为“回文子串”的中心,向两侧扩展,直到左右两侧扩展字符不相同为止,即得到一个回文子串。保存整个遍历过程中得到的最长的回文子串即可
    • 注意n个字符会有n-1个间隔,所以会有2n-1个”中心“
  • 图解:
    算法精讲-leetcode5-最长回文子串-扩展中心解法_第1张图片

代码示例

public class Test {
    public static void main(String[] args) {
        String str = "ababcbae";
        String s = longestPalindrome(str);
        System.out.println("当前所判断的字符串为"+str);
        System.out.println("最长回文子串为"+s);
    }
    public static String longestPalindrome(String s) {

        //无效输入直接返回""
        if (s == null || s.length() < 1) return "";

        //定义回文子串处于所给字符串s的位置
        int start = 0, end = 0;

        //遍历s,因为每一个字符作为对称中心时,后面的空位也可作为对称中心
        //则每次循环对当前遍历的字符和字符后面的空位同时计算统计
        for (int i = 0; i < s.length(); i++) {

            //计算以当前字符为对称中心时,回文子串的长度
            int len1 = expandAroundCenter(s, i, i);

            //计算以当前字符   后面空位  为对称中心时,回文子串的长度
            int len2 = expandAroundCenter(s, i, i + 1);

            //只取上面两者最长的长度
            int len = Math.max(len1, len2);

            //计算之前遍历中,出现的最长的回文子串的长度
            int maxLen = end - start;

            //如果当前回文子串的长度大于之前出现的最长的回文子串的长度,则进行数据更新
            if (len > maxLen) {
                start = i - (len - 1) / 2;
                end = i + len / 2;
            }
        }
        return s.substring(start, end + 1);
    }

    private static int expandAroundCenter(String s, int left, int right) {
        while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
            left--;
            right++;
        }
        return right - left - 1;
    }
}

运行结果

算法精讲-leetcode5-最长回文子串-扩展中心解法_第2张图片

▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧,为了下次方便找到,也可关注加收藏呀
如果有什么意见或建议,也可留言区讨论

你可能感兴趣的:(java,算法)