【分析】该问题的最优解可以从局部的最优解导出,且计算过程中存在大量重复计算,显然是要用动态规划了。
用二维布尔数组mem[][]记录每个子串是否为回文,mem[i][j]表示第i个字符到第j个字符间的子串是否为回文。
初始化:当i>=j时mem[i][j] =true, i=j时就一个字符必定为回文,i<j时设为true是为了当S[i]=S[j]且j=i+1(S表示原字符串)时能够以j>i+1的情况一样处理。
过程:若S[i] == S[j]则mem[i][j] = mem[i+1][j-1],否则mem[i][j] = false
【上码】
/*
* 最长回文子串
* 动态规划 O(n^2)
*/
public class Solution {
public String longestPalindrome(String s) {
char[] chars = s.toCharArray();
int longest = 0, start = 0,end = 0;
int len = s.length();
boolean[][] mem = new boolean[len][len];
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (i >= j) {
mem[i][j] = true;
} else {
mem[i][j] = false;
}
}
}
for (int j = 1; j < len; j++) {
for (int i = 0; i<j; i++) {
if (chars[i] == chars[j]) {
mem[i][j] = mem[i+1][j-1];
int currLen = j-i+1;
if (mem[i][j] == true && longest<currLen) {
longest = currLen;
start = i;
end = j;
}
}
else {
mem[i][j] = false;
}
}
}
return s.substring(start, end+1);
}
}