第一种解法,动态规划
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len <= 1) return s;
boolean[][] dp = new boolean[len][len];
for(int j = 0;j < len;j++){
for(int i = 0; i <= j;i++){
if(s.charAt(i) == s.charAt(j)){
if(j - i < 3){
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
}else{
dp[i][j] = false;
}
}
}
int max = -1;
String res = "";
for(int j = 0;j < len;j++){
for(int i = 0; i <= j;i++){
if(dp[i][j]){
if(j - i > max){
max = j - i;
res = s.substring(i,j + 1);
}
}
}
}
return res;
}
}
第二种,中心拓展法
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len <= 1) return s;
int start = 0,end = 0;
for(int i = 0; i < s.length();i++){
int len1 = expend(s,i,i);
int len2 = expend(s,i,i + 1);
int max = Math.max(len1,len2);
if(max > end - start){
start = i - (max - 1) / 2;
end = i + max / 2;
}
}
return s.substring(start,end + 1);
}
public int expend(String s,int left,int right){
while( left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){
--left;
++right;
}
return right - left - 1;
}
}