最大回文串

给定一个字符串,找最大的连续回文字串,其中连续的定义是左侧依次递增,右侧依次递减,如 aba,符合条件,bcdefedcb符合条件,注意abba不符合。初看可能是用模式匹配或者KMP的算法,用这些应该也可以,但其实我们可以注意到,这里的字符是递增,递减的特殊关系,因此可以从第二个开始即i=1的位置,同时向他的两边找,找的数目记为j,从j=1开始;如果符合则继续找j++,否则退出j的循环,同时找的位置从i+j-1开始;注意向两边找的长度j的范围:
1.当i是在字符串前段,j <= i,即没有遍历到超过给定串的一半;
2.当i是在字符串后段,j<=(len-i -1),已经超过了一半;
以下是代码:

public class MaxIncrePalindromeLen {

    public static void main(String[] args) {
        String s1 = "abddabcbad";
        String s2 = "abcbcdd";
        String s3 = "cdefedcdefedcba";
        String s4 = "bcbefed";
        String s5 = "aba";
        String s6 = "aaaaaaaaba";

        System.out.println(maxLen(s1));
        System.out.println(maxLen(s2));
        System.out.println(maxLen(s3));
        System.out.println(maxLen(s4));
        System.out.println(maxLen(s5));
        System.out.println(maxLen(s6));
        System.out.println(maxLen("3"));
        System.out.println(maxLen("dd"));
        System.out.println(maxLen(null));
    }


    public static int maxLen(String str) {
        if (null == str || str.length() < 3) {
            return 0;
        }

        int max = 0;
        int len = str.length();
        for (int i = 1; i < len - 1; i++) {
            for (int j = 1; j <= ((i <= len / 2) ? i : (len - i - 1)); j++) {
                if (str.charAt(i - j) == (str.charAt(i) - j) && (str.charAt(i + j) == str.charAt(i) - j)) {
                    max = (2 * j + 1 > max) ? (2 * j + 1) : max;
                } else {
                    i = i + j - 1;
                    break;
                }
            }
        }

        return max;
    }
}
    原文作者:西5d
    原文地址: https://www.jianshu.com/p/fd5f51c227a7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞