最大回文子串

 public static String longestPalindrome1(String s) {
        int startAndEnd[] = new int[2];

        for (int i = 0; i < s.length(); i++) {
            getMaxSubStr(s, startAndEnd, i, i);//
            getMaxSubStr(s, startAndEnd, i, i + 1);//
        }
        return s.substring(startAndEnd[0], startAndEnd[1]);
    }

    private static void getMaxSubStr(String s, int[] startAndEnd, int start, int end) {
        for (; start >= 0 && end < s.length() && s.charAt(start) == s.charAt(end); ) {
            start--;
            end++;
        }
        if (end - start - 1 > startAndEnd[1] - startAndEnd[0] + 1) {
            startAndEnd[0] = start + 1;
            startAndEnd[1] = end;//前包后不包
        }
    }

 

 public String longestPalindrome(String s) {
        int len = s.length();
        if (len < 2) {
            return s;
        }
        int maxLen = 1;
        String res = s.substring(0, 1);
        // 中心位置枚举到 len - 2 即可
        for (int i = 0; i < len - 1; i++) {
            String oddStr = centerSpread(s, i, i);
            String evenStr = centerSpread(s, i, i + 1);
            String maxLenStr = oddStr.length() > evenStr.length() ? oddStr : evenStr;
            if (maxLenStr.length() > maxLen) {
                maxLen = maxLenStr.length();
                res = maxLenStr;
            }
        }
        return res;
    }

    private String centerSpread(String s, int left, int right) {
        // left = right 的时候,此时回文中心是一个字符,回文串的长度是奇数
        // right = left + 1 的时候,此时回文中心是一个空隙,回文串的长度是偶数
        int len = s.length();
        int i = left;
        int j = right;
        while (i >= 0 && j < len) {
            if (s.charAt(i) == s.charAt(j)) {
                i--;
                j++;
            } else {
                break;
            }
        }
        // 这里要小心,跳出 while 循环时,恰好满足 s.charAt(i) != s.charAt(j),因此不能取 i,不能取 j
        return s.substring(i + 1, j);
    }

 

 String aa = "cababad";
        int ret[] = new int[2];
        for (int i = 0; i < aa.length(); i++) {
            abc(i, i + 1, aa, ret);
            abc(i, i, aa, ret);
        }
        System.out.println();

 public static void abc(int left, int right, String s, int ret[]) {
        for (; left >= 0 && right < s.length(); ) {
            if (s.charAt(left) == s.charAt(right)) {
                left--;
                right++;
            } else
                break;
        }

        if ((right - 1) - (left + 1) + 1 > ret[1]) {
            ret[0] = left + 1;
            ret[1] = (right - 1) - (left + 1) + 1;
        }
    }

 

posted @ 2020-08-08 12:12  soft.push("zzq")  Views(78)  Comments(0)    收藏  举报