class Solution {
public String longestPalindrome(String s) {
if(s.length() == 0){
return "";
}
String[][] dp = new String[s.length()][s.length()];
int n = s.length();
for(int i=0; i<n; i++){
dp[i][i] = s.substring(i,i+1);
}
int l = n/2;
int r = n/2;
while(!(l==0 && r==n-1)){
if(l>0){
l--;
}
if(r<n-1){
r++;
}
longest(l, r, s, dp);
}
return dp[0][n-1];
}
public String longest(int l, int r, String s, String[][] dp) {
if(dp[l][r] != null){
return dp[l][r];
} else if(s.charAt(l) == s.charAt(r) && (l == r-1 || longest(l+1, r-1, s, dp).length() == ((r-1) - (l+1))+1)){
dp[l][r] = s.substring(l,r+1);
return dp[l][r];
} else {
String l1 = longest(l, r-1, s, dp);
String l2 = longest(l+1, r, s, dp);
dp[l][r] = l1.length() > l2.length() ? l1 : l2;
return dp[l][r];
}
}
}
dp [i] [j] представляет максимальную строку палиндроми c между индексами i, j. В конце мы вернем dp [0] [s.length () - 1]
Анализ кода:
Если строка (скажем, b) имеет длину 1, максимальный палиндром, который мы можем получить из него саму строку (б). Теперь давайте расширим строку до следующего + b +. Какой будет самая длинная строка палиндроми c, если знаки + заменены некоторыми алфавитами. Мы можем рассмотреть две возможности: i) оба алфавита одинаковы ii) оба они различны. Если случай i ->, мы можем сказать, что вся строка является палиндромом, поскольку мы знали, что строка между алфавитами является полностью палиндромом. В случае ii -> у нас будет две возможности: рассмотреть левую и игнорировать правую или рассмотреть правую и игнорировать левую. Тот, который мы ищем, это тот, который выдает максимальную строку палиндроми c.
Основываясь на этой идее, мы заполним весь массив dp.
Я знаю сложность пространства для алгоритма O (n ^ 2), но какова сложность времени выполнения. Это O (n ^ 2) или O (n ^ 3)?