题目描述
思路
方法一:动态规划
首先要明白子串就是指连续的子序列。用s(i,j)表示下标i,j之间的子串,如果s(i,j)是回文串,那么由对称性必然可以得出s(i+1,j-1)也是回文串。当用dp[i][j]表示下标i,j间的子串是否是回文子串,则可以得出推导公式:dp[i][j] = dp[i+1][j-1] && (s[i] == s[j]);(j-i > 1)。
java版本
class Solution {
public String longestPalindrome(String s) {
int _size = s.length();
boolean dp[][] = new boolean[_size][_size];
int max = 0;
int pos = 0;
String ans = "";
for (int l = 0;l < _size; l ++) {
for (int i = 0;i + l < _size;i ++) {
int j = i + l;
char a = s.charAt(i);
char b = s.charAt(j);
if (l == 0) {
dp[i][j] = true;
}
else if (l == 1) {
dp[i][j] = (a == b);
}
else {
dp[i][j] = (a==b) && dp[i+1][j-1];
}
if (dp[i][j]) {
ans = s.substring(i, j+1);
}
}
}
return ans;
}
}
JavaScript版本
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
let map = new Array(s.length);
for(i = 0;i < s.length;i ++){
map[i] = [];
for (j = 0;j < s.length;j ++) {
map[i].push(false);
}
}
ans = "";
for(let l = 0;l < s.length;l ++ ) {
for (let i = 0;i + l < s.length;i ++) {
let j = i+l;
if(l == 0) {
map[i][j] = true;
}
else if(l == 1) {
map[i][j] = (s[i]==s[j]);
}
else {
map[i][j] = map[i+1][j-1] && (s[i] == s[j]);
}
if (map[i][j]) {
ans = s.substring(i,j+1)
}
}
}
return ans;
};