题目:
ac代码:
class Solution {
// 中间扩散
public static String getmaxhuiwen(int l,int r,String s) {
if(l>r)
return "";
while (l >= 0 && r <= s.length() - 1) {
if (s.charAt(l) == s.charAt(r)) {
l--;
r++;
} else {
break;
}
}
return s.substring(l+1, r);
}
public static String longestPalindrome(String s) {
int max = 0;
String va = "";
if(s.length()<2)
return s;//""和"a"
int mid = (s.length()-1) / 2;//中间(偶数左侧,奇数中间)
for (int i = 0; i <= mid; i++) {
int l = mid - i, r = l;//左奇数个
String s1=getmaxhuiwen(l, r, s);
va=va.length()>s1.length()?va:s1;
l=mid-i;r=l+1;//左偶数个
s1=getmaxhuiwen(l, r, s);
va=va.length()>s1.length()?va:s1;
l=mid+i;r=l;//右奇数个
s1=getmaxhuiwen(l, r, s);
va=va.length()>s1.length()?va:s1;
l=mid+i;r=l+1;//右偶数个
s1=getmaxhuiwen(l, r, s);
va=va.length()>s1.length()?va:s1;
max=va.length();//最大回文长度
if(max>(mid-i+1)*2)//找不到更长直接返回
break;
}
return va;
}
}
算法思路:从中心往两边移动,当回文子串长度大于两倍边界时,就没有必要继续查找了。