中心扩展算法(最长回文字符串)

class Solution {
    public String longestPalindrome(String s) {
        if(s == null || s.length() == 0){  //这部不能掉,否则会错误
            return "";
        }
        int start = 0, end = 0; //用来记录最长子串的首尾坐标
        for(int i=0;i             int len1 = expandAroundCenter(s,i,i);   //以i为中心
            int len2 = expandAroundCenter(s,i,i+1);  //以i和i+1为中心
            //关于i=length-1的时候,i+1会超出的情况,其实再expandAroundCenter那个方法中while条件里面 right<=length-1,已经解决了
            int len = Math.max(len1,len2);
            if(len > end - start){   //这里的代码很重要,是通过分类计算总结来的
                start = i - (len-1)/2;
                end = i + len/2 ;
            }
        }
        return s.substring(start, end+1);  //因为subString说的是左闭右开
    }
    
    public int expandAroundCenter(String s,int left,int right){
        while(left >=0 && right <= s.length()-1 && s.charAt(left) == s.charAt(right)){
            left--;
            right++;
        }
        return right - left - 1;   //注意这里非常容易出错,因为上面多加了步 left-- 和 right++ ,所以最后停下来的位置的 left 和 right 并不是回文,而是刚好超过一步的地方 right - left + 1 - 2
    }
}

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