int i =0;while(i < cs.length){int l = i -1;int r = i;while(++r < cs.length && cs[r]== cs[i]);
i = r;while(l >=0&& r < cs.length && cs[l]== cs[r]){
l--;
r++;}// 扩展结束后,cs[l+1,r)为 找到的最大回文子串// ++l后,l就是开始索引int len = r -++l;if(len > maxLen){
maxLen = len;
begin = l;}}
Solution 4 - Manacher
classSolution{public String longestPalindrome(String s){if(s == null)return null;if(s.length()<=1)return s;char[] oldCs = s.toCharArray();// 最长回文子串的长度int maxLen =0;// 预处理char[] cs =preProcess(oldCs);// 构建m数组int[] m =newint[cs.length];int c =1, r =1, lastIdx = m.length -2;int idx =0;for(int i =2; i < lastIdx; i++){// m数组首尾必定没有回文子串if(r > i){// 判断是否在以c为中心的最长回文子串中,对称性int li =(c <<1)- i;// 以c为中心的最长回文子串的周开始索引
m[i]=(i + m[li]<= r)? m[li]: r - i;// 以i为中心的回文子串的右索引,在r左边为m[li],大于等于为至少}// 以i为中心,向左右扩展while(cs[i + m[i]+1]== cs[i - m[i]-1]){
m[i]++;// 如果能扩展,m[i]++}// 更新c,r,为了使回文对称区域大而右if(i + m[i]> r){
c = i;
r = i + m[i];}if(m[i]> maxLen){
maxLen = m[i];
idx = i;}}int begin =(idx - maxLen)>>1;returnnewString(oldCs, begin, maxLen);}privatechar[]preProcess(char[] oldCs){char[] cs =newchar[(oldCs.length <<1)+3];
cs[0]='^';
cs[1]='#';
cs[cs.length -1]='$';for(int i =0; i < oldCs.length; i++){int idx =(i +1)<<1;
cs[idx]= oldCs[i];
cs[idx +1]='#';}return cs;}}