LeetCode05 最长回文子串

最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。
最长回文子串.

暴力解法

    /**
     * 暴力解法
     * @param s
     * @return
     */
    public static String longestPalindrome(String s) {
        if (s.length()<2){
            return s;
        }
        char[] chars = s.toCharArray();
        int maxLen = 1;
        int begin = 0;
        for (int i = 0; i < chars.length-1 ; i++) {
            for (int j = i+1; j < chars.length ; j++) {
                if (j-i+1>maxLen && validPalindromic(chars, i, j)){
                    maxLen = j-i+1;
                    begin = i;
                }
            }

        }

        return s.substring(begin,begin+maxLen);
    }
    static boolean  validPalindromic(char[] chars,int left, int right){
        while(left<=right){
            if (chars[left] != chars[right])
                return false;
            left++;
            right--;
        }
        return true;
    }

中心扩散解法

    /**
     * 中心扩散
     * 问题 考虑到了 左索引 和 长度 相加计算右索引时需要-1 但没考虑到subString的参数是左闭右开 粗心!!
     * @param s
     * @return
     */
    public static String longestPalindrome2(String s) {
        if (s.length() < 2){
            return s;
        }
        int maxLen = 1;
        int begin = 0;
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length-1; i++) {
        	// 获取以 i 为中心的最长字串的长度
            int oddLen = getCenterLength(chars,i,i);
            // 获取以(i,i+1)为中心的最长字串的长度
            int evenLen = -1;
            if (chars[i] == chars[i+1]){
                evenLen = getCenterLength(chars,i,i+1);
            }
            // 获取两者中大的那一个
            int curMax = Math.max(oddLen, evenLen);
            if (curMax>maxLen){
            // 通过计算获得开始坐标和长度
                maxLen = curMax;
                begin = i - (maxLen-1)/2;
            }
        }

        return s.substring(begin,begin+maxLen);
    }

    static int getCenterLength(char[] chars, int left, int right){
        while (left >= 0 && right<chars.length && chars[left] == chars[right]){
                left--;
                right++;
        return right-left-1;
    }
上一篇:定义一个泛型为String类型的List集合,统计该集合中每个字符 (注意,不是字符串)出现的次数。例如:集合中有”abc”、”bcd”两个元素, 程序最终输出结果为:


下一篇:Hololens Rest API