1, Brute force, 时间:O(n^3) 空间:substring的begin index, end index两个循环,再一一判断中间夹的是不是palindrome
2. DP: A[ i ][ j ] = A[ i+1] [ j - 1] 时间: O(n^2) 空间:O(n^2)可以根据递推公式的方向,想象一下从对角线一直推到右上角,来写loop
1,存什么?
想递推公式: 按照一般的套路,如果我知道之前len-1个字符的最长substring -》len个字符的最长substring?此路貌似不通。于是转b思路,先找到所有palindromic substring,这时就可以拆分了.
2,changing condition: A[ i ][ j ] = A[ i+1] [ j - 1]
3,start condition
**************************************
求最值问题的两条路:
a. 子问题的最值 -》慢慢加上来 (用最少的硬币凑数)
b. 找到所有满足条件的情况,一边找一边更新结果
**************************************
3. 中心展开法, 时间:O(n^2) 空间:O(1) 尼玛空间怎么看?substring的mid index一个循环,有中间往外扩,判断是不是palindrome
// 1. brute force solution
public class Solution {
public String longestPalindrome(String s) {
if (s == null) return null;
int max = 0;
String maxSub = "";
for (int beg = 0; beg < s.length(); beg++){
for (int end = beg + 1; end <= s.length(); end++){
String sub = s.substring(beg, end);
if (isPalindrome(sub)) {
int len = end - beg;
if (len > max) {
max = len;
maxSub = sub;
}
}
}
}
return maxSub;
}
public boolean isPalindrome(String s) {
int i = 0;
int j = s.length() - 1;
while (i < j){
if (s.charAt(i) != s.charAt(j)) return false;
i++;
j--;
}
return true;
}
}
/**
* 2. Dynamic programming:
* starting condition: 1.subproblem: s.length() == 1 true
* 2.s.length() == 2 if 第一个和第二个char相等,true
**/
public class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() <=1) return s;
int len = s.length();
int maxlen = 0;
String max = "";
boolean[][] res = new boolean[len][len];
for (int i = 0; i < len; i++){
res[i][i] = true;
}
for (int i = 0; i < len-1; i++){
if (s.charAt(i) == s.charAt(i+1)) {
res[i][i+1] = true;
maxlen = 2;
max = s.substring(i, i+2);
}
}
for (int d = 2; d < len; d++) {
for (int i = 0; i < len - d; i++) {
int j = d + i;
if (res[i+1][j-1] && s.charAt(i) == s.charAt(j)) {
res[i][j] = true;
if (j - i + 1 > maxlen) {
maxlen = j - i + 1;
max = s.substring(i, j+1);
}
}
}
}
return max;
}
}
3.
public class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() <=1) return s;
int len = s.length();
int maxlen = 1;
String max = s.substring(0, 1);
for (int center = 1; center < len; center++) {
String temp1 = helper(s, center-1, center);
String temp2 = helper(s, center, center);
temp1 = temp1.length() > temp2.length()? temp1 : temp2;
if(temp1.length() > maxlen) {
maxlen = temp1.length();
max = temp1;
}
}
return max;
}
public String helper(String s, int beg, int end){
while (beg >= 0 && end <= s.length()-1 && s.charAt(beg) == s.charAt(end)) {
beg--;
end++;
}
return s.substring(beg+1, end);
}
}