暴力解法
直接判断每一个子串是不是回文子串,然后取其中最长的值返回
public class Palindrome {
public int getLongestPalindrome(String A, int n) {
int maxLen = 0;
//暴力解法
for(int i = 0; i < n; i++){
for(int j = i+1; j <= n; j++){
String now = A.substring(i,j);
if(isPalindrome(now) && now.length() > maxLen){
maxLen = now.length();
}
}
}
return maxLen;
}
//判断子串是不是回文子串
public boolean isPalindrome(String s){
int l = s.length();
for(int i = 0; i < l/2; i++){
if(s.charAt(i) != s.charAt(l-i-1))
return false;
}
return true;
}
} 中心扩散法
public class Palindrome {
public int getLongestPalindrome(String A, int n) {
if(n == 0)
return 0;
int maxLen = 1;
//中心枚举到n-2位置
for(int i = 0; i < n-1; i++){
// 比较以i为中心扩散的回文子串 && 以i和i+1为中心扩散的回文子串 哪个大取哪个
int len = centerSpread(A,i,i) > centerSpread(A,i,i+1)? centerSpread(A,i,i):centerSpread(A,i,i+1);
maxLen = Math.max(maxLen,len);
}
return maxLen;
}
//若left==right 则扩散中点为一个,此时的回文子串为奇数
//若left!=right,则扩散的中点为 left和right,此时的回文子串为偶数
public int centerSpread(String s, int left, int right){
int len = s.length();
int l = left;
int r = right;
while(l >= 0 && r <= len-1){
//若相等则继续扩散
if(s.charAt(l) == s.charAt(r)){
l--;
r++;
}else{
break;
}
}
//为什么还要减2 因为上面while循环终止了,此时s.charAt(l) != s.charAt(r)
//所以此时的回文子串的左右边界其实是 l-1, r-1
return r-l+1-2;
}
}

京公网安备 11010502036488号