LeetCode算法之最长回文子串

最长回文子串

算法思想:

1、循环条件不符合之前也进行了L--和R++的操作,实际上长度多了俩,所以得剪掉2. 即(R-L+1)-2

2、中心扩展算法,一步步分解示例字符串才懂这个算法。

3、首先,要明白expandAroundCenter函数作用是以一个中心向两侧扩展找到这个中心最长回文串的长度,参数left和right就是为了指定中心。
其次,中心可能是一个或两个字符。如:对于字符串“abcda”,“c”是中心;对于字符串“adccda”,“cc”是中心。
那么,expandAroundCenter(s, i, i)就是在找以 i(一个字符)为中心的最长回文串的长度;expandAroundCenter(s, i, i + 1)是在找以 i 和i+1(两个字符)为中心的最长回文串的长度。
将得到的两个长度和缓存的最长回文串长度相比较。若新得到的长度较长,表达式:start = i - (len - 1) / 2;end = i + len / 2; 就得出了新的最长回文串的开始和结束位置。
最后,for循环遍历了一遍,以一个字符为中心总共找了 n 次,以两个字符为中心总共找了 n-1 次,所以说“总共有2n−1 个这样的中心”。

4、if (len > end - start) {
            start = i - (len - 1) / 2;
            end = i + len / 2;
        }

根据得出的最长回文子串长度len, 与 回文中心 i ,每次求 回文串的start 与 end (每次都赋值)

=====================================================

算法思路比结果代码更重要!

public static List longestPalindrome1(String s) {
        List stringList = new ArrayList<>();
        if (s == null || s.length() < 1) return stringList;
        int start = 0, end = 0, maxlen=Integer.MAX_VALUE;
        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);

            //如果大于或者等于上一次的回文的长度
            if (len >= end - start) {
                start = i - (len - 1) / 2;
                end = i + len / 2;

                //跟上一个长度做比较
                if(maxlen==Integer.MAX_VALUE){
                    maxlen = len;
                    stringList.add(s.substring(start, end + 1));
                }else if(len==maxlen){
                    stringList.add(s.substring(start, end + 1));
                }else if(len > maxlen){
                    maxlen=len;
                    stringList.clear();
                    stringList.add(s.substring(start, end + 1));
                }
            }
        }
        return stringList;
    }

    //通过中心扩展法求得以数组当中的某个字符为中心的最大回文长度
    private static int expandAroundCenter(String s, int left, int right) {
        int L = left, R = right;
        while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
            L--;
            R++;
        }
        return R - L - 1;
    }

 

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