public class Solution {
public String longestPalindrome(String s) {
if(s.length() < 2) {
return s;
}
// DP
// P[i][j] == true
// s.substring(i, j + 1)
boolean[][] P = new boolean[s.length()][s.length()];
int max = 1;
int start = 0;
// Base case 1
for(int i = 0; i < s.length(); i++) {
P[i][i] = true;
}
// Base case 2
for(int i = 0; i < s.length() - 1; i++) {
if(s.charAt(i) == s.charAt(i + 1)) {
P[i][i + 1] = true;
max = 2;
start = i;
}
}
// Rec
for(int len = 3; len <= s.length(); len++) {
for(int i = 0; i <= s.length() - len; i++) {
int j = i + len - 1;
if(s.charAt(i) == s.charAt(j) && P[i + 1][j - 1] == true) {
P[i][j] = true;
max = len;
start = i;
}
}
}
return s.substring(start, start + max);
}
}
Time: O(n^2)
Space: O(n^2)