- 动态规划
边界条件:
- dp[i][i] = true (L == 0)
- dp[i][i + 1] = s[i] == s[i + 1] (L == 1)
状态转移方程(L >= 2):
- dp[i][i + L] = dp[i + 1][i + L - 1] && (s[i] == s[i + L])
class Solution {
public String longestPalindrome(String s) {
int length = s.length();
boolean dp[][] = new boolean[length][length];
int index1 = 0, index2 = 0, max = 0;
for(int L = 0; L <= length; L++){
for(int i = 0; i + L < length; i++){
int j = i + L;
if(L == 0){
dp[i][j] = true;
}
else if(L == 1){
dp[i][j] = (s.charAt(i) == s.charAt(j));
}else{
dp[i][j] = dp[i + 1][j - 1] && (s.charAt(i) == s.charAt(j));
}
if(dp[i][j] && L + 1 > max){
max = L + 1;
index1 = i;
index2 = j;
}
}
}
return s.substring(index1, index2 + 1);
}
}
- 中心扩散
从回文串向两边扩散
class Solution {
public String longestPalindrome(String s) {
int length = s.length();
int len1 = 0, len2 = 0, max = 0, index1 = 0, index2 = 0;
for(int i = 0; i < length; i++){
len1 = expand(i, i, s);
len2 = expand(i, i + 1, s);
max = Math.max(len1, len2);
if(max > index2 - index1){
index1 = i - (max - 1) / 2;
index2 = i + max / 2;
}
}
return s.substring(index1, index2 + 1);
}
public int expand(int i, int j, String s){
while(i >= 0 && j < s.length() && (s.charAt(i) == s.charAt(j))){
--i;
++j;
}
return j - i - 1;
}
}